process substitution使用文件名很好,例如都
$cat <FILENAME
和
$while read i; do echo $i; done <FILENAME
工作.
但是如果不使用FILENAME,我们使用echo命令(或任何其他产生输出到stdout的命令),cat继续工作
$cat <(echo XXX) XXX
而循环
$while read i; do echo $i; done <(echo XXX) bash: Syntax error near unexpected token `<(echo XXX)'
产生错误.
有什么想法吗?
注意:< filename不是进程替换.它是一个
redirection.进程替换的格式为<(命令). 进程替换用<(...)替换进程的名称.尽管使用<符号,它不是重定向. 因此,当你说cat<(echo foo)时,bash创建一个子进程来运行echo命令,并替换可以读取的伪文件的名称以获取该命令的输出.替换的结果将是这样的:
原文链接:/bash/384207.htmlcat /dev/fd/63
请注意,没有重定向. (您可以通过键入echo<(echo foo)来查看此操作.) 像许多实用程序一样,可以使用或不使用命令行参数调用cat;如果没有指定文件,则从stdin读取.所以cat file.txt和cat< file.txt非常相似. 但while命令不接受其他参数.所以
while read -r line; do echo "$line"; done < file.txt
是有效的,但是
while read -r line; do echo "$line"; done file.txt
是语法错误.
流程替换不会改变这一点.所以
while read -r line; do echo "$line"; done /dev/fd/63
是语法错误,因此也是如此
while read -r line; do echo "$line"; done <(echo foo)
while read -r line; do echo "$line"; done < <(echo foo)
请注意,两者之间必须有一个空格.符号以避免与“here-doc”语法混淆,<< word.