gpt4 book ai didi

bash - 为什么在 bash while 循环中使用 "<&3"、 "3&-"和 "3
转载 作者:行者123 更新时间:2023-11-29 09:41:52 26 4
gpt4 key购买 nike

我正在检查一个 bash 脚本,试图弄清楚它是如何工作的,并可能对其进行修补。有问题的脚本是 this cryptroot来自 debian 的脚本负责在启动时解密 block 设备。不完全熟悉 bash 绝对是一个挑战。

我发现了这段代码,但我不确定它的作用。

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的输出定向至read在 while 循环中执行 COMMAND直到最后一行。

我也对重定向有所了解,例如,我有时用它来重定向 STDOUTSTDERR/dev/null 这样的东西例如。但我不确定重定向到 3 是什么意思是。

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

The file descriptors for stdin, stdout, and stderr are 0, 1, and 2, respectively. For opening additional files, there remain descriptors 3 to 9.

所以 3 “只是”对打开文件的引用或者:

...simply a number that the operating system assigns to an open file to keep track of it. Consider it a simplified type of file pointer.

据我了解:

  • 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

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

最佳答案

常见问题

while read LINE
do COMMAND
done < FILE

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

关于bash - 为什么在 bash while 循环中使用 "<&3"、 "3&-"和 "3</file"?它实际上有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57665703/

26 4 0

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com