据我了解 bash 文档都 |和 < 重定向标准输入。因此,cmd | foo
和foo < <(cmd)
应该或多或少等效。然而,对于 bash-internal read 命令来说,情况似乎并非如此。例如,如果我输入
a=""; b=""; read a b < <(echo a b); echo $a $b
它打印出来a b
,同时
a=""; b=""; echo a b | read a b; echo $a $b
什么也没打印出来。另一方面,如果我输入
a=""; b=""; cat < <(echo a b) >foo1
a=""; b=""; echo a b | cat > foo2
文件 foo1 和 foo2 完全相同。所以我的问题是:当涉及读取命令(或一般情况)时,两种形式有什么区别?他们应该看到完全相同的重定向输入。虽然该< <(...)
表单有效,但我发现它非常难以阅读,并且更喜欢使用管道表单。
答案1
管道操作read
在子 shell 中执行,而进程替换则不然。对于大多数用例,这不是问题,但在这种情况下,您希望直接影响 shell(通过操作变量)。因为read
是在子shell中调用的,所以只有子shell受到影响。因此,您可能希望对它们执行的任何操作也需要在子 shell 中执行;例如:
echo a b | { read a b ; echo "$a" "$b" ; }