我一直在寻找并且无法找到明确的线索来验证我从给我的剧本中推断出的内容。
所以file.txt是一个打开的文件(由文件描述符3),并且不断通过记录时间戳的脚本添加新行。每次在文件中添加新行时,下面的部分是否会进入while循环?
exec 3 < /path/file.txt
while read <&3
command
command..
done
因此,只要我不关闭文件描述符,添加到我的file.txt的新行将始终激活while循环,对吧?
请帮我澄清一下。感谢
答案 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
中有新行,您可以读取,但重定向会提供无法知道是否文件中添加了一个新行,供您的代码响应。它还需要您的代码来检查。