首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在循环中使用"<&3“、"3&-”和"3</file“?它实际上是做什么的?

为什么在循环中使用"<&3“、"3&-”和"3</file“?它实际上是做什么的?
EN

Stack Overflow用户
提问于 2019-08-26 22:37:36
回答 1查看 1.1K关注 0票数 2

我正在浏览bash脚本,试图找出它是如何工作的,并可能对其进行修补。所讨论的脚本是debian的 cryptroot脚本,负责在引导时解密块设备。在巴什没有完全呆在家里,这肯定是一个挑战。

我找到了这段代码,我不知道它能做什么。

代码语言:javascript
复制
if [ -r /conf/conf.d/cryptroot ]; then
    while read mapping <&3; do
        setup_mapping "$mapping" 3<&-
    done 3< /conf/conf.d/cryptroot
fi

我的猜测是,它读取/conf/conf.d/cryptroot中的每一行并将其传递给setup_mapping。但我不太明白<&33&-3</conf/conf.d/cryptroot的意义是什么,以及它们是做什么的?

当我从文件中读取行时,我通常会这样做:

代码语言:javascript
复制
while read LINE
    do COMMAND
done < FILE

其中,FILE的输出被定向到while循环中的read,并一直执行COMMAND直到最后一行。

我也知道一些关于重定向的知识,比如,我有时用它将STDOUTSTDERR重定向到/dev/null之类的东西上。但我不知道重定向到3意味着什么。

根据tldp.org的说法,在阅读了更多关于I/O重定向的内容之后,我得到了一些接近答案的答案。

stdin、stdout和stderr的文件描述符分别为0、1和2。对于打开其他文件,还有3到9的描述符。

因此,3“只是”对打开的文件的引用,或者:

...simply操作系统分配给打开的文件以跟踪它的数字。将其视为文件指针的简化类型。

据我所知:

  • 3< /conf/conf.d/cryptroot打开/conf/conf.d/cryptroot进行读取,并将其分配给文件描述符3。
  • read mapping <&3似乎正在读取文件描述符3中的第一行,它指向打开的文件/conf/conf.d/cryptroot
  • setup_mapping "$mapping" 3<&-似乎正在关闭文件描述符3,这是否意味着它将在循环中的每一个回合中再次打开并指向下一行?

如果以上是正确的,我的问题是为什么这样做,而不是“正常”的方式?例如:

代码语言:javascript
复制
while read mapping; do
    setup_mapping "$mapping"
done < /conf/conf.d/cryptroot

第一个版本提供了什么优势(如果有的话)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-26 22:41:38

一个常见的问题

代码语言:javascript
复制
while read LINE
    do COMMAND
done < FILE

人们忘记了命令也是从文件中读取的,并且潜在地消耗了read在while循环控件中要读取的数据。为了避免这种情况,一个常见的成语是从不同的文件描述符中读取。这是用<&3完成的。但是这样做会打开命令的文件描述符3。这可能不是一个问题,但使用3<&-显式关闭它是合理的。简而言之,您所看到的构造只是避免setup_mapping无意中读取用于read的数据的一种方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57665703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档