如何使用bash和read将命令输出分配给变量

如何使用bash和read将命令输出分配给变量,bash,shell,Bash,Shell,我试图将命令的输出分配给多个变量,每个输出“字”一个变量。Doing(linux上的bash) 仅显示空字符串。做 read FOO BAR BAZ < <(echo foo bar barz) echo $FOO $BAR $BAZ 阅读FOO-BAR-BAZ< 在这种情况下,它不会打印任何内容。原因是管道创建了一个子shell,其中FOO、BAR和BAZ获取值 echo foo bar baz | { read FOO BAR BAZ ; echo $FOO $BAR $BA

我试图将命令的输出分配给多个变量,每个输出“字”一个变量。Doing(linux上的bash)

仅显示空字符串。做

read FOO BAR BAZ < <(echo foo bar barz)
echo $FOO $BAR $BAZ
阅读FOO-BAR-BAZ<
在这种情况下,它不会打印任何内容。原因是管道创建了一个子shell,其中
FOO
BAR
BAZ
获取值

echo foo bar baz | { read FOO BAR BAZ ;  echo $FOO $BAR $BAZ ;}
尝试此操作,它将打印所有变量的正确值。这里,大括号封装了
echo
命令,以便在读取变量的同一子shell中运行

read FOO BAR BAZ < <(echo foo bar barz)
echo $FOO $BAR $BAZ

阅读FOO-BAR-BAZ<对米希尔的答案进行补充-

read a b c <<< "$( echo 1 2 3 )" # a here-string

readabc管道创建无法改变非子shell环境的shubshell。我将在一分钟内链接一个副本和答案。既然你已经有了一个工作代码,我想你只是想解释一下发生了什么。用户很好地解释了这一点。管道操作发生在子shell中,因此任何声明的变量都只能在子shell中访问。解释了问题,但在unix SE上。当有人在StackOVerflow上找到一个好的副本时,请链接它。我肯定有一个。看:
read FOO BAR BAZ < <(echo foo bar barz)
echo $FOO $BAR $BAZ
read a b c <<< "$( echo 1 2 3 )" # a here-string