从右向左重定向到代码块

从右向左重定向到代码块

考虑这种情况:

diff file.txt <( cat file.txt | grep -v '^\s*#'| sed '/^$/d' )

这是从右到左重定向的示例,其中处理文件并将结果重定向为diff.已经提出了类似的用例这里,效果也很好。

但是,尝试以类似的方式将文件处理结果重定向到代码块会失败:

  while read I; do
  done <( cat $FIL | <do_something_here> )

Syntax error: "(" unexpected

或者,如果你尝试这样做:

done < <( cat $FIL | <do_something_here> )

Syntax error: redirection unexpected

如何将某个进程的输出重定向到代码块作为输入?

答案1

<(...) 流程替代是 Korn shell 的一个功能。它也可以在 zsh 和 bash 中使用。rc和衍生物,fish也有进程替换支持,但具有不同的语法,而在 yash shell 中<(...)是不同功能的语法:进程重定向

那个的措辞语法错误:意外重定向错误表明您的 shell 是 Almquist shell 的衍生版本,例如dash.据我所知,都没有流程替代也不进程重定向已被添加到任何ash衍生品中。

while ...; done <(cmd)可以在 、 中工作yashwhile ...; done < <(cmd)可以在 AT&T ksh、zsh 和 bash 中工作,但两者都不是标准sh语法,也不能在dash.

dash(或任何sh实现)中,您需要cmd | while ...; done,但请注意,在 中dash, while 循环将在子 shell 中运行。

你可以这样做:

while ...; done << EOF
$(cmd)
EOF

但请注意,它将整个输出cmd(至少去除所有 NUL 字符dash和所有尾随换行符)存储在内存中(并添加回一个额外的换行符)。

任何状况之下,使用while read循环通常表明您采用了错误的方法,特别是如果它只是用于文本处理。

相关内容