微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么进程替换并不总是与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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐