我正在浏览bash脚本,试图找出它是如何工作的,并可能对其进行修补。所讨论的脚本是debian的这 cryptroot脚本,负责在引导时解密块设备。在巴什没有完全呆在家里,这肯定是一个挑战。
我找到了这段代码,我不知道它能做什么。
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。但我不太明白<&3、3&-和3</conf/conf.d/cryptroot的意义是什么,以及它们是做什么的?
当我从文件中读取行时,我通常会这样做:
while read LINE
do COMMAND
done < FILE其中,FILE的输出被定向到while循环中的read,并一直执行COMMAND直到最后一行。
我也知道一些关于重定向的知识,比如,我有时用它将STDOUT和STDERR重定向到/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,这是否意味着它将在循环中的每一个回合中再次打开并指向下一行?如果以上是正确的,我的问题是为什么这样做,而不是“正常”的方式?例如:
while read mapping; do
setup_mapping "$mapping"
done < /conf/conf.d/cryptroot第一个版本提供了什么优势(如果有的话)?
发布于 2019-08-26 22:41:38
一个常见的问题
while read LINE
do COMMAND
done < FILE人们忘记了命令也是从文件中读取的,并且潜在地消耗了read在while循环控件中要读取的数据。为了避免这种情况,一个常见的成语是从不同的文件描述符中读取。这是用<&3完成的。但是这样做会打开命令的文件描述符3。这可能不是一个问题,但使用3<&-显式关闭它是合理的。简而言之,您所看到的构造只是避免setup_mapping无意中读取用于read的数据的一种方法。
https://stackoverflow.com/questions/57665703
复制相似问题