循环遍历 Zsh 中的文件内容

Looping through the content of a file in Zsh

我正在尝试循环访问 zsh 中的文件内容。在我的循环中,我想获得用户输入。从 this answer for Bash 开始,我正在尝试做:

while read -u 10 line; do
  echo $line;
  # TODO read from stdin here, etc.
done 10<myfile.txt

但是我得到一个错误:

zsh: parse error near `10'

指的是done之后的10。显然我没有得到正确的文件描述符语法,但我在弄清楚文档时遇到了麻烦。

使用小于 10 的文件描述符编号。如果要对文件描述符编号进行硬编码,请坚持使用 3-9 的范围(标准输入、输出、错误加上 0-2)。当 zsh 本身需要文件描述符时,它会在 10+ 范围内使用它们。

如果您甚至需要超过 7 个可用的硬编码文件描述符,您真的应该考虑使用变量来命名它们。 exec {myfd}<myfile.txt 之类的语法将使用 zsh 分配大于 10 的文件描述符并将其分配给 $myfd.

打开文件

Bourne shell 语法并非完全明确,因为文件描述符编号为 10 及以上,甚至在 bash 中,我建议不要使用它们。我不完全确定 bash 如果它需要打开任何供内部使用如何避免冲突 - 我想它永远不需要保持任何打开状态。乍一看,这可能看起来像 zsh 限制,但实际上是一个明智的功能。