为什么在管道末端使用时无法读取填充变量?

时间:2010-05-17 21:10:52

标签: linux bash

为什么输出为空?

echo "a b c d" | read X Y Z V
echo $X

我以为会a

3 个答案:

答案 0 :(得分:6)

问题在于,为了运行read命令及其从echo重定向的输入,将生成一个新的子shell进程。这个过程读取值,将它们分配给变量 - 然后退出;然后运行第二个echo命令。为了证明这一点,您可以从子shell中执行第二个echoread

$ echo "a b c d" | ( read X Y Z V; echo $X )
a

答案 1 :(得分:6)

在Bash中,你可以做几件不同的事情来实现这个目标:

这里有一个字符串:

read X Y Z V <<< $(echo "a b c d"); echo $X

流程替换:

read X Y Z V < <(echo "a b c d"); echo $X

带有命令替换的here文档:

read X Y Z V <<EOF
$(echo "a b c d")
EOF
echo $X

除了Bash之外,here文档方法也适用于POSIX shell。

如果你是从一个文件而不是从另一个命令的输出中读取的,那就更简单了。

答案 2 :(得分:5)

我认为这是因为echo "a b c d" | read X Y Z Vecho $X是单独的陈述(我不确定确切的用语)?所以一个人不了解另一个。

编辑:尝试echo "a b c d" | ( read X Y Z V; echo $X ) ...