53

I'm trying to redirect command output to a variable:

OUTPUT=$(sudo apache2ctl configtest)

and then to read it:

echo $OUTPUT

When running it the output is the following:

19:19:12 user@user ~ OUTPUT=$(sudo apache2ctl configtest)
Syntax OK
Syntax OK

But the variable stays blank. I've tried the same for other commands and everything works fine.

OUTPUT=$(ls -l)

This writes file list to variable OUTPUT so that it can be read later. What should i do to make it work?

1
  • 1
    The usual cause is from having a space between OUTPUT and = this isn't true in your case? Commented Apr 25, 2012 at 16:26

2 Answers 2

87

Maybe the output goes to stderr, not stdout? Try this:

OUTPUT="$(sudo apache2ctl configtest 2>&1)"
Sign up to request clarification or add additional context in comments.

1 Comment

Personally I find a bit more explanatory the answer stackoverflow.com/a/3130425/1504300
2

For nginx possible situation when configtest can be successful with error in config files. Example:

nginx: [warn] conflicting server name "test.com" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

for correct check errors in bash scripts need use:

if [[ $((sudo /sbin/service nginx configtest) 2>&1 | grep "failed\|warn" ) ]]; then
    echo "ERROR!!!"
else
    echo "OK!!!"
fi

1 Comment

if [[ $(<cmd>) ]]; then; echo error; else echo ok; fi cound be written as <cmd> || { echo error; } && { echo ok; }, which is a bit less verbose and gives the command a bit more prominence. (The curly braces (along with the semicolons) in my example could be left out as well if they only contain one command and the whole thing is a one-liner.)

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.