bash:对循环条件和主体使用不同的输入流

bash:对循环条件和主体使用不同的输入流

我有一个带有 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

问题:

  1. 这是最好的解决方案吗?

  2. 使用文件描述符 3 安全/推荐吗? fd 编号越高,引起冲突的机会就越小吗?

答案1

对命令使用单独的文件描述符read是一个很好的解决方案。

保证您可以使用 3 到 9 之间的文件描述符来执行此操作。 shell 不会将它们用于其他用途。只有文件描述符 0、1 和 2 具有预定义的用途,并且您可能发现使用值大于 9 的描述符是可行的,但没有这样的保证。

POSIX 标准说

打开的文件由从零开始的十进制数字表示。最大可能值是实现定义的;然而,所有实现都应至少支持 0 到 9(含)以供应用程序使用。这些数字称为“文件描述符”。值 0、1 和 2 有特殊含义和常规用途,并且由某些重定向操作暗示;它们分别称为标准输入、标准输出和标准错误。

使用 9 以上的文件描述符可能会很危险,具体取决于您使用的编号和 shell:

  • bash内部使用 fd 255。
  • zshdashpdksh在内部使用 fd 10。
  • ksh93似乎使用 fd 3 (但这似乎是一个错误,它连接到用作当前文件系统挂载点的目录)。

相关内容