问题是如何捕获命令的输出,以便稍后在脚本中使用变量保存。我可能会重复一些早期的答案,但我会尽力列出我能想到的所有答案进行比较和评论,请耐心等待。
直观的构造方式:
echo test | read x
echo x=$x
由于ksh已经实现了在管道序列中最后一个命令是当前shell的一部分,因此在Korn shell中有效。换句话说,前面的管道命令是子shell。相比之下,其他shell将所有管道命令都定义为子shell,包括最后一个。
这正是我喜欢ksh的确切原因。
但是,必须使用其他shell(例如bash)时,必须使用另一种构造。
要捕获1个值,可以使用以下构造:
x=$(echo test)
echo x=$x
但这只适用于收集1个值以供以后使用。
为了捕获更多的值,此结构在bash和ksh中非常有用:
read x y <<< $(echo test again)
echo x=$x y=$y
我注意到有一种变体在bash中可以工作,但在ksh中不行:
read x y < <(echo test again)
echo x=$x y=$y
<<< $(...)是一种here-document变体,具有标准命令行的所有元处理功能。< <(...)是文件替换运算符的输入重定向。
现在我在所有脚本中都使用"<<< $(",因为它似乎是各种shell变体之间最可移植的构造。我有一套工具集,在任何Unix版本上都可以使用。
当然,还有普遍适用但粗糙的解决方案:
command-1 | {command-2; echo "x=test; y=again" > file.tmp; chmod 700 file.tmp}
. ./file.tmp
rm file.tmp
echo x=$x y=$y
shopt -s lastpipe
命令,管道中的最后一个命令应该会影响到变量 -- http://tldp.org/LDP/abs/html/bashver4.html#LASTPIPEOPT - imz -- Ivan Zakharyaschev