为什么输出空?
echo "a b c d" | read X Y Z V
echo $X
Run Code Online (Sandbox Code Playgroud)
我以为会是a.
问题是,为了运行read从其重定向的输入的命令,echo产生了一个新的子shell进程.这个过程读取值,将它们分配给变量 - 然后退出; 然后echo运行第二个命令.为了证明这一点,你可以从子shell 做第二个echo和read两个:
$ echo "a b c d" | ( read X Y Z V; echo $X )
a
Run Code Online (Sandbox Code Playgroud)
在Bash中,您可以执行以下几项不同的操作:
这里的字符串:
read X Y Z V <<< $(echo "a b c d"); echo $X
Run Code Online (Sandbox Code Playgroud)
流程替代:
read X Y Z V < <(echo "a b c d"); echo $X
Run Code Online (Sandbox Code Playgroud)
带有命令替换的here文档:
read X Y Z V <<EOF
$(echo "a b c d")
EOF
echo $X
Run Code Online (Sandbox Code Playgroud)
除了Bash之外,here文档方法也适用于POSIX shell.
如果您正在从文件中读取而不是从另一个命令的输出中读取,那么它会更简单一些.
我相信这是因为echo "a b c d" | read X Y Z V并且echo $X是单独的陈述(我不确定确切的术语)?所以一个人不了解另一个.
编辑:echo "a b c d" | ( read X Y Z V; echo $X )试一试......