我有一个带有这样的while循环的脚本:
while IFS= read -r name; do
{body}
done < names.txt
循环条件需要从文件中读取名称,但{body}
需要从标准输入中读取;上面的脚本会{body}
从文件中读取,这是一个错误;
我可以用另一个 fd 解决:
while IFS= read -r name <&3; do
{body}
done 3< names.txt
问题:
这是最好的解决方案吗?
使用文件描述符 3 是否安全/推荐?较高的 fd 数会减少引发冲突的机会吗?
为命令使用单独的文件描述符
read
是一个很好的解决方案。您可以保证 3 到 9 之间的文件描述符可供您执行此操作。shell 不会将这些用于其他任何事情。只有文件描述符 0、1 和 2 具有预定义用途,您可能会发现使用值大于 9 的描述符有效,但没有这样的保证。
POSIX 标准说:
使用大于 9 的文件描述符可能很危险,具体取决于您使用的数字和外壳:
bash
内部使用 fd 255。zsh
,dash
并在pdksh
内部使用 fd 10。ksh93
似乎使用 fd 3 (但这似乎是一个错误,它连接到用作当前文件系统的挂载点的目录)。