60

I have a problem concerning storing the output of a command inside a variable within a bash script.
I know in general there are two ways to do this

either

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

but for the Java version query, this doesn't seem to work.

I did:

version=$(java --version)

This doesn't store the value inside the var. It even still prints it, which really shouldn't be the case.

I also tried redirecting output to a file but this also fails.

user unknown
  • 35,537
  • 11
  • 75
  • 121
user1278282
  • 611
  • 1
  • 5
  • 3
  • there are more than two ways. read foo < <( echo "this is another way") but this is unrelated to your problem with catching error output, answered below already. – Deleted User Jun 06 '14 at 21:07

2 Answers2

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

The version param only takes one dash, and if you redirect stderr, which is, where the message is written to, you'll get the desired result.

As a sidenote, using two dashes is an inofficial standard on Unix like systems, but since Java tries to be almost identical over different platforms, it violates the Unix/Linux-expectations and behaves the same in this regard as on windows, and as I suspect, on Mac OS.

user unknown
  • 35,537
  • 11
  • 75
  • 121
16

That is because java -version writes to stderr and not stdout. You should use:

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

In order to redirect stderr to stdout.

You can see it by running the following 2 commands:

java -version > /dev/null

java -version 2> /dev/null
bmk
  • 13,849
  • 5
  • 37
  • 46
Eran Ben-Natan
  • 2,515
  • 2
  • 16
  • 19