Bash文件描述符3和读取行

时间:2014-12-08 06:56:30

标签: bash while-loop file-descriptor

我一直在寻找并且无法找到明确的线索来验证我从给我的剧本中推断出的内容。

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

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

因此,只要我不关闭文件描述符,添加到我的file.txt的新行将始终激活while循环,对吧?

请帮我澄清一下。感谢

2 个答案:

答案 0 :(得分:5)

要从文件描述符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循环永远不会完成。

答案 1 :(得分:2)

  

因此,只要我不关闭文件描述符,就会添加一条新行   file.txt将始终激活while循环,对吗?

答案:错误。

重定向exec 3 < /path/file.txt使您能够使用文件描述符从/path/file.txt 读取,但允许任何类型的/path/file.txt触发到您的代码。这样想吧。 如果/path/file.txt中有新行,您可以读取,但重定向会提供无法知道是否文件中添加了一个新行,供您的代码响应。它还需要您的代码来检查。