2012-03-19 149 views
46

我有一個問題,有關將命令的輸出存儲在bash腳本中的變量內。
我知道一般有兩種方法可以做到這一點Bash腳本存儲命令輸出到變量

要麼

foo=$(bar) 
# or 
foo=`bar` 

但對於Java版本的查詢,這似乎並沒有工作。

我所做的:

version=$(java --version) 

這並不存儲VAR內的值。它甚至還能打印出來,實際情況並非如此。

我也嘗試重定向輸出到一個文件,但這也失敗了。

+0

有超過兩種方式。閱讀foo <<(回聲「這是另一種方式」),但這與捕獲錯誤輸出的問題無關,已在下面回答。 – 2014-06-06 21:07:26

回答

56
version=$(java -version 2>&1) 

版本PARAM只需要一個破折號,如果你重定向標準錯誤,這就是,在該消息被寫入,你會得到期望的結果。

作爲一個副作用,在系統上使用兩個破折號是Unix上的一個非官方標準,但由於Java試圖在不同平臺上幾乎相同,它違反了Unix/Linux的期望,並且在這方面的行爲與在Windows ,正如我懷疑的那樣,在Mac OS上。

+0

感謝一噸,正是我在尋找的 – user1278282 2012-03-19 12:31:12

+0

你如何知道輸出是否寫入stderr或stdout? – user1527227 2014-07-25 19:59:13

+2

@ user1527227:您可以測試它。 – 2014-07-26 08:41:26

14

那是因爲java -version寫入stderr而不是stdout。您應該使用:

version=$(java -version 2>&1) 

爲了stderr重定向到stdout

您可以通過運行以下兩個命令看到:

java -version > /dev/null 

java -version 2> /dev/null 
+0

謝謝你的洞察,好像頂也打印版太stderr – user1278282 2012-03-19 12:31:26

相關問題