为什么进程替换并不总是与bash中的while循环一起使用?
发布时间:2020-12-16 01:17:14 所属栏目:安全 来源:网络整理
导读:process substitution使用文件名很好,例如都 $cat FILENAME 和 $while read i; do echo $i; done FILENAME 工作. 但是如果不使用FILENAME,我们使用echo命令(或任何其他产生输出到stdout的命令),cat继续工作 $cat (echo XXX)XXX 而循环 $while read i; do ech
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |