Перенаправление вывода команды в переменную в bash не выполняется

Я пытаюсь перенаправить вывод команды на переменную:

OUTPUT=$(sudo apache2ctl configtest)

а затем прочитать его:

echo $OUTPUT

При его запуске вывод следующий:

19:19:12 [email protected] ~ OUTPUT=$(sudo apache2ctl configtest)
Syntax OK
Syntax OK

Но переменная остается пустой. Я пробовал то же самое для других команд, и все работает нормально.

OUTPUT=$(ls -l)

Это записывает список файлов в переменную OUTPUT чтобы его можно было прочитать позже. Что я должен сделать, чтобы он работал?

Ответ 1

возможно, выход идет на stderr, а не на stdout?

попробуйте это: OUTPUT=$(sudo apache2ctl configtest 2>&1)

Ответ 2

Для возможной ситуации nginx, когда configtest может быть успешным с ошибкой в файлах конфигурации. Пример:

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

для правильной проверки ошибок в сценариях bash необходимо использовать:

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