我想使用 bash、tail 和使用不同的文件描述符逐行读取文件。所有指南都使用此方法:
方法一:
echo 1111111 > z.txt
exec {newFD}< <(tail -f -c +0 "z.txt")
while IFS= read -r LINE0 <&${newFD}
do
printf '%s' "$LINE0"
done
但这种方法也有效:
方法二:
echo 1111111 > z.txt
while IFS= read -r LINE0 <&${newFD}
do
printf '%s' "$LINE0"
done {newFD}< <(tail -f -c +0 "z.txt")
使用第二种方法有什么问题吗?
为什么我不需要exec
第二种方法?谢谢你。
{newFD} 自动给了我一个免费的文件描述符:自 bash 4.1+ (2009-12-31) {varname} 样式自动文件描述符分配以来可用的功能
你没有。在这两种情况下,您都将获得分配并存储在 中的新文件描述符
newFD
,从进程替换中读取。没有功能上的区别。两者之间的错误行为可能略有不同,但在这种情况下,它应该不明显。方法 1 对 fd 的生命周期可能稍微透明一些(在任何一种情况下,它都不仅仅局限于 while 循环),并将源放在更靠近它的使用位置。为了清楚起见,我可能更喜欢这样写,但没有实际区别。无论哪种方式,文件描述符都需要在之后关闭。
你可以用你喜欢的任何风格来写这个,两者都可以。
请注意,虽然这
while read
不是打开文件描述符:任何命令都存在的普通 shell 重定向操作正在发生,无论是命令while
还是exec
命令。while
循环被视为单个复合命令,并在调用 shell 中运行。可以附加到命令的所有常见内容也可以使用 while 循环。重定向标准 IO 流(或另一个已打开的 FD)时,重定向有一些特殊行为
exec
:它将永久操纵当前 shell 的环境,而不仅仅是运行实际命令的子 shell 的环境。但是,这不适用于{newFD}< ...
.当像这样动态分配新的 FD 时,FD 总是分配给父代,而不是子代,否则变量将无用。这意味着任何命令都可以工作,甚至
做同样的事情
exec {newFD}< <(...)
。