我有一个带有 while 循环的脚本,如下所示:
while IFS= read -r name; do
{body}
done < names.txt
循环条件需要从文件中读取名称,但{body}
需要从stdin中读取;上面的脚本将从{body}
文件中读取,这是一个错误;
我可以和另一个FD一起解决:
while IFS= read -r name <&3; do
{body}
done 3< names.txt
问题:
这是最好的解决方案吗?
使用文件描述符 3 安全/推荐吗? fd 编号越高,引起冲突的机会就越小吗?
答案1
对命令使用单独的文件描述符read
是一个很好的解决方案。
保证您可以使用 3 到 9 之间的文件描述符来执行此操作。 shell 不会将它们用于其他用途。只有文件描述符 0、1 和 2 具有预定义的用途,并且您可能发现使用值大于 9 的描述符是可行的,但没有这样的保证。
打开的文件由从零开始的十进制数字表示。最大可能值是实现定义的;然而,所有实现都应至少支持 0 到 9(含)以供应用程序使用。这些数字称为“文件描述符”。值 0、1 和 2 有特殊含义和常规用途,并且由某些重定向操作暗示;它们分别称为标准输入、标准输出和标准错误。
使用 9 以上的文件描述符可能会很危险,具体取决于您使用的编号和 shell:
bash
内部使用 fd 255。zsh
,dash
并pdksh
在内部使用 fd 10。ksh93
似乎使用 fd 3 (但这似乎是一个错误,它连接到用作当前文件系统挂载点的目录)。