2012-03-19 307 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

相关问题