Bash file descriptor 3 and while read line

5

我一直在寻找线索,却没有找到明确的证据来验证我从一个给定脚本中推断出的内容。

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

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

只要我不关闭文件描述符,对于我的file.txt添加的新行将一直激活while循环,是吗?请帮我澄清这一点。谢谢。

你可能会对exec的详细解释感兴趣。https://dev59.com/ZGMl5IYBdhLWcg3wgnIE - xiaowl
2个回答

8
要从文件描述符3中读取,请使用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

3
只要我不关闭文件描述符,就会一直激活while循环,是吗?
回答:错误。
重定向exec 3 < /path/file.txt让您能够使用文件描述符从/path/file.txt读取,但它不能触发/path/file.txt对您的代码的任何类型的响应。这样想:如果/path/file.txt中有一个新行,您可以读取它,但重定向无法知道文件是否已添加新行以供您的代码响应。仍然由您的代码检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接