Как узнать, был ли вывод отправлен на stderr

Я должен обернуть команду в сценарии bash.

Если команда завершается с кодом выхода!= 0 и / или записывает в stderr, произошел сбой, который необходимо обработать.

Первое условие простое. Но как определить, был ли вывод на stderr? Я не хочу перехватывать или захватывать вывод (если нет другого пути), мне просто нужно знать, был ли он.

2 ответа

Решение

Вы можете сделать это, заметив, что файловые дескрипторы процесса представлены в / proc /. Например, если вы делаете

$ ls -l /proc/self/fd/2
lrwx------ 1 meuh meuh 64 Jul 16 10:06 /proc/self/fd/2 -> /dev/pts/2

в xterm или аналогичном вы можете увидеть, что stderr для себя, bash, это pty. Следуйте по символической ссылке в ls чтобы получить реальное время последней модификации pty:

$ ls -lL /proc/self/fd/2
crw--w---- 1 meuh tty 136, 2 Jul 16 10:05 /proc/self/fd/2

Лучше использовать команду stat, которая дает лучшее разрешение по времени.

$ stat -L -c %y /proc/self/fd/2
2015-07-16 10:03:54.553125813

Поэтому просто сохраните метку времени перед вашей командой и сравните ее после команды, чтобы увидеть, отличается ли она.

before=$(stat -L -c %y /proc/self/fd/2)
if mycommand &&
 after=$(stat -L -c %y /proc/self/fd/2) &&
 [ "$after" = "$before" ]
then echo 'command ok'
else echo 'command fail'
fi

Предложение: "tee" stderr во временный файл и проверьте, имеет ли этот файл ненулевой размер в конце команды.

Другие вопросы по тегам