Bash 读取命令和 stdin 重定向

Bash 读取命令和 stdin 重定向

据我了解 bash 文档都 |和 < 重定向标准输入。因此,cmd | foofoo < <(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" ; }

相关内容