Bash 读取命令和标准输入重定向

Elm*_*der 8 bash io-redirection

据我了解 bash 文档 和 < 重定向标准输入。所以,cmd | foofoo < <(cmd)应该或多或少是等价的。但是,对于 bash 内部读取命令,情况似乎并非如此。例如,如果我输入

a=""; b=""; read a b < <(echo a b); echo $a $b
Run Code Online (Sandbox Code Playgroud)

它打印出来a b,而

a=""; b=""; echo a b | read a b; echo $a $b
Run Code Online (Sandbox Code Playgroud)

什么都不打印。另一方面,如果我输入

a=""; b=""; cat < <(echo a b) >foo1

a=""; b=""; echo a b | cat > foo2
Run Code Online (Sandbox Code Playgroud)

文件 foo1 和 foo2 完全相同。所以我的问题是:当涉及(或一般)读取命令时,这两种形式有什么区别?他们应该看到完全相同的重定向输入。虽然< <(...)表单有效,但我发现它非常难以理解,并且更喜欢使用管道表单。

Chr*_*own 10

流水线操作read在子 shell 中执行,而进程替换则不然。对于大多数用例,这不是问题,但在这种情况下,您希望直接影响 shell(通过操作变量)。因为read已经在子shell中被调用,所以只有子shell受到影响。因此,您可能希望对它们执行的任何操作也需要在子 shell 中执行;例如:

echo a b | { read a b ; echo "$a" "$b" ; }
Run Code Online (Sandbox Code Playgroud)

  • @ElmarZander - 不要使用 TLDP 臭名昭著的“高级”Bash 脚本指南,它会教你编写错误,而不是脚本。有些地方写得不好,还有更多地方完全错误。我推荐 [BashGuide](http://mywiki.wooledge.org/BashGuide) 代替。 (2认同)