为什么输出为空?
echo "a b c d" | read X Y Z V
echo $X
我以为会a
。
答案 0 :(得分:6)
问题在于,为了运行read
命令及其从echo
重定向的输入,将生成一个新的子shell进程。这个过程读取值,将它们分配给变量 - 然后退出;然后运行第二个echo
命令。为了证明这一点,您可以从子shell中执行第二个echo
和read
:
$ 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 V
和echo $X
是单独的陈述(我不确定确切的用语)?所以一个人不了解另一个。
编辑:尝试echo "a b c d" | ( read X Y Z V; echo $X )
...