【问题标题】:Bash file descriptor 3 and while read lineBash 文件描述符 3 和 while 读取行
【发布时间】:2015-02-05 19:20:35
【问题描述】:

我一直在寻找,但找不到明确的线索来验证我从给我的脚本中推断出的内容。

所以 file.txt 是一个打开的文件(通过文件描述符 3),并且通过记录时间戳的脚本不断添加新行。每次向文件中添加新行时,以下部分是否会进入 while 循环?

exec 3 < /path/file.txt
while read <&3
  command
  command..
done

所以只要我不关闭文件描述符,添加到我的file.txt的新行总是会激活while循环,对吗?

请帮我解决这个问题。谢谢

【问题讨论】:

标签: bash while-loop file-descriptor


【解决方案1】:

要从文件描述符 3 中读取,请使用 read -u 3(请参阅 Bash builtins)。不要忘记指定要读取值的变量名称。

一旦read 检测到EOF,它就停留在EOF;之后它不会发现文件的添加。因此,如果向文件中添加行的代码比此脚本中的代码慢,您将到达终点并且循环将终止。如果你不想这样,可以考虑使用tail -f /path/file.txt,也可以考虑使用process substitution

while read -u 3 line
do
    command1
    command2
done 3< <(tail -f /path/file.txt)

或者,如果你想做exec

exec 3< <(tail -f /path/file.txt)

while read -u 3 line
do
    command1
    command2
done

请注意,在您以某种方式中断脚本之前,tail -f 循环永远不会结束。

【讨论】:

  • read -u 3 允许从per code-block basis 上的文件描述符重定向,而无需使用exec 手动打开描述符。 while read &lt;&amp;3 很好,用exec 打开描述符并且需要用exec 3&gt;&amp;- 关闭。
【解决方案2】:

所以只要我不关闭文件描述符,就会在我的文件描述符中添加一个新行 file.txt 总是会激活 while 循环,对吧?

答案:错误。

重定向exec 3 &lt; /path/file.txt 使您能够使用文件描述符从/path/file.txt 读取,但没有允许任何类型的触发 strong> 从/path/file.txt 到您的代码。这样想吧。 如果/path/file.txt 中有新行,您可以阅读,但重定向无法知道是否有新行行已添加到文件中,供您的代码响应。这仍然取决于您的代码来检查。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多