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

Voj*_*lko 4 linux bash

为什么输出空?

echo "a b c d" | read X Y Z V
echo $X
Run Code Online (Sandbox Code Playgroud)

我以为会是a.

psm*_*ars 6

问题是,为了运行read从其重定向的输入的命令,echo产生了一个新的子shell进程.这个过程读取值,将它们分配给变量 - 然后退出; 然后echo运行第二个命令.为了证明这一点,你可以从子shell 做第二个echoread两个:

$ echo "a b c d" | ( read X Y Z V; echo $X )
a
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 6

在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.

如果您正在从文件中读取而不是从另一个命令的输出中读取,那么它会更简单一些.


nev*_*219 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 )试一试......