Вы можете сделать это, отметив, что дескрипторы файлов процесса выставлены в/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 для себя, Баш, является псевдотерминал. Следуйте симлинк в ls
, чтобы получить реальное время последней модификации PTY:
$ ls -lL /proc/self/fd/2
crw--w---- 1 meuh tty 136, 2 Jul 16 10:05 /proc/self/fd/2
Лучше команда использования является стат, которая дает лучшее разрешение по времени.
$ 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
Я не думаю, что есть какой-либо способ, если сама команда ничего не сообщит. Захват stderr и проверка того, есть ли что-то, легки, и я не совсем уверен, почему вы хотите сделать это, как обычно, можно было бы * захватить * либо или и то, и другое. Не просто проверить, есть ли что-то в ошибке. Кроме того, команда может также выводить предупреждающие сообщения на stderr. Таким образом, надежный способ проверки * сбоя * заключается в использовании кода возврата. –
Если в любом случае был разумный код возврата, вы были правы; к сожалению, это не так. Но комбинация кода stderr и возврата дает нам правильный результат. – wonk0
Код выхода можно получить из '$?'. Что касается 'stderr', я не уверен, что его можно проверить или, возможно, вам нужно записать во временный файл – krato