为什么"echo foo | read a; echo $ a"没有按预期工作?

Dio*_*lis 7 unix linux shell

我可以在FreeBSD,GNU/Linux和Solaris下使用各种shell复制问题.它让我头疼了一个多小时,所以我决定在这里发布这个问题.

Bom*_*mbe 14

由于管道,read它在自己的子壳中执行.

echo foo | while read a; do echo $a; done
Run Code Online (Sandbox Code Playgroud)

会做你期望的.


wim*_*ica 6

替代方案:

echo foo | (read a ; echo $a)
Run Code Online (Sandbox Code Playgroud)

编辑:

如果在子shell外需要$ a,则必须反转命令:

read a < <(echo foo); echo $a
Run Code Online (Sandbox Code Playgroud)

这样,读取在当前进程中执行