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.

1
  • 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. Commented Jun 6, 2014 at 21:07

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

3 Comments

How do you know if the output is written to stderr or stdout?
@user1527227: You can test it.
A bit late but Thank you!!
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

1 Comment

thank you for your insight, it seems top also prints the version too stderr

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.