我一直在寻找线索,却没有找到明确的证据来验证我从一个给定脚本中推断出的内容。
所以file.txt是一个打开的文件(由文件描述符3),并且通过记录时间戳的脚本不断添加新行。每次添加新行时,以下代码块是否都进入while循环?
exec 3 < /path/file.txt
while read <&3
command
command..
done
只要我不关闭文件描述符,对于我的file.txt添加的新行将一直激活while循环,是吗?请帮我澄清这一点。谢谢。
我一直在寻找线索,却没有找到明确的证据来验证我从一个给定脚本中推断出的内容。
所以file.txt是一个打开的文件(由文件描述符3),并且通过记录时间戳的脚本不断添加新行。每次添加新行时,以下代码块是否都进入while循环?
exec 3 < /path/file.txt
while read <&3
command
command..
done
read -u 3
(参见Bash内置命令)。不要忘记指定变量名以读取值。read
检测到EOF,它将停留在EOF;它不会检测文件后续的添加。因此,如果向文件添加行的代码比此脚本中的代码慢,您将达到一个结束点,循环将终止。如果您不希望这样,请考虑使用tail -f /path/file.txt
,也许还要使用进程替代: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
允许在 代码块级别
上从文件描述符进行重定向,而无需手动使用 exec
打开描述符。当描述符使用 exec
打开时,while read <&3
是可以的,并且需要使用 exec 3>&-
进行关闭。 - David C. Rankin
exec
的详细解释感兴趣。https://dev59.com/ZGMl5IYBdhLWcg3wgnIE - xiaowl