2017-11-11 118 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 

這對我的作品。

相關問題