gpt4 book ai didi

bash - 为什么进程替换并不总是适用于 bash 中的 while 循环?

转载 作者:行者123 更新时间:2023-11-29 08:51:00 24 4
gpt4 key购买 nike

process substitution可以很好地处理文件名,例如两者

$ cat <FILENAME

$ while read i; do echo $i; done <FILENAME

工作。

但是如果我们使用 echo 命令(或任何其他生成输出到标准输出的命令)而不是 FILENAME,cat 会继续工作

$ cat <(echo XXX)
XXX

循环

$ while read i; do echo $i; done <(echo XXX) 
bash: syntax error near unexpected token `<(echo XXX)'

产生错误。

有什么想法吗?

最佳答案

注意: <b><</b><em>filename</em> 不是进程替换。这是一个redirection .进程替换的格式为 <b><(</b><em>command</em><b>)</b> .

进程替换用进程名称代替<(...) .尽管使用了 < 符号,但它不是重定向。

所以当你说 cat <(echo foo) , bash 创建一个子进程来运行 echo命令,并替换为可以读取的伪文件的名称以获取该命令的输出。替换的结果将是这样的:

cat /dev/fd/63

请注意没有重定向。 (您可以通过输入 echo <(echo foo) 来查看实际效果。)

像许多实用程序一样,cat可以使用或不使用命令行参数调用;如果未指定文件,则从 stdin 读取.所以cat file.txtcat < 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 - 为什么进程替换并不总是适用于 bash 中的 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com