2017-11-11 119 views
0

我以前做过这个。为什么我不将shell命令的结果保存到我的变量中?

我已经在这个论坛上看过很多文章,并且更多地关于如何将shell命令的结果保存到变量中。所有的人说这样做

VAR="$(shell_command)" 
echo $VAR 

VAR=`shell_command` 
echo $VAR 

但我想这样做

VAR="$(python2.7 -V)" 
echo "Version is $VAR" 

VAR=`python2.7 -V` 
echo "Version is $VAR" 

,我看到

Python 2.7.14 
Version is 

IOW我没有存储结果?为什么是这样?我只是想纯粹的bash,并且想要理解为什么它没有做我期望的事情。谢谢!

回答

1

在这种特殊情况下,这是因为Python将版本打印到其标准错误流。 $(...)构建(或反引号)仅捕获给定命令发送给标准输出的内容。

在这种情况下,您可以通过编写$(python2.7 -V 2>&1)来解决此问题。这里的2>&1是shell代码,意思是“用标准输出流的副本替换标准错误流”,所以任何Python 认为它写入标准错误实际上是到达标准输出的目的地。

请注意,在某些情况下,不正确使用引号会导致类似的问题。总的来说这是一个好主意,围绕命令替换用双引号:

VAR="$(python2.7 -V 2>&1)" 

原来不是在这种情况下,虽然关系。

1

试试这个:

python2.7 -V >/dev/null 

之后,你仍然看到输出,这意味着版本信息没有发送到标准输出(标准输出)。

这:

python2.7 -V 2>/dev/null 

输出消失,进一步证实了它发送到标准错误。

所以,你想做到这一点:

VAR="$(python2.7 -V 2>&1)" 
#     ^^^^ 
# Redirect stderr to stdout 

这对我的作品。

相关问题