为什么进程替换并不总是与bash中的while循环一起使用?

前端之家收集整理的这篇文章主要介绍了为什么进程替换并不总是与bash中的while循环一起使用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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命令,并替换可以读取的伪文件名称获取该命令的输出.替换的结果将是这样的:
cat /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.

猜你在找的Bash相关文章