47

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?

roman
  • 5,100
  • 14
  • 44
  • 77

2 Answers2

80

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

OUTPUT="$(sudo apache2ctl configtest 2>&1)"
Edward Z. Yang
  • 26,325
  • 16
  • 80
  • 110
johnshen64
  • 3,734
  • 1
  • 21
  • 17
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
beliy
  • 445
  • 6
  • 13
  • 1
    `if [[ $() ]]; then; echo error; else echo ok; fi` cound be written as ` || { 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.) – flotzilla Feb 07 '21 at 16:18