考虑这种情况:
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)
可以在 、 中工作yash
,while ...; 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
循环通常表明您采用了错误的方法,特别是如果它只是用于文本处理。