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.)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.