2015-08-14 132 views
0

我已經命令了一個命令,返回'版本:X'。bash:解析命令的輸出並將其存儲到變量中

即:

$>./mybox -v 
$>version:2 

我不明白爲什麼這不工作:

$>VERSION=$(/home/mybox -v | sed 's/.*version:\([0-9]*\).*/\1/') 
$>echo $VERSION 
$> 

,如果我寫這篇文章,它是確定:

$>VERSION=$(echo "version:2" | sed 's/.*version:\([0-9]*\).*/\1/') 
$>echo $VERSION 
$>2 

問候

回答

5

這對versi來說很常見打開/錯誤/調試信息發送到stderr,而不是stdout。當從終端運行命令時,兩者都將被打印,但只有stdout將通過管道傳送到sed

echo默認情況下,輸出始終爲stdout,這就是爲什麼您在那裏沒有問題。

如果以上是正確的,你只需要重定向stderr(文件描述符2)將其傳遞之前stdout(文件描述符1):

VERSION=$(/home/mybox -v 2>&1 | sed 's/.*version:\([0-9]*\).*/\1/') 
#       ^^^^ 
+0

不會「版本:2」的出現在這種情況下在控制檯?它不在問題的例子中。 – Sleafar

+2

@Sleafar通常是的,除非它在複製粘貼或控制檯行覆蓋的工件中被忽略。這可能是一個評論,但它變得越來越長,我決定改變預感。 –

相關問題