Временное перенаправление stderr в скрипте bash - PullRequest
4 голосов
/ 15 января 2009

У меня есть простой скрипт, который используется для запуска другой программы. Эта другая программа может иногда выдавать SIGSEGV, что нарушает мой вывод. Поэтому я добавил пару строк, которые должны временно перенаправить stderr на /dev/null, так что SIGSEGV игнорируется. Вот черновик моего кода:

exec 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>1

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

Любая помощь будет оценена!

Ответы [ 2 ]

8 голосов
/ 15 января 2009

Другой вариант:

exec 3> /dev/stderr 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3

Или даже

exec 3>&2 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3

Таким образом, сценарий сохраняет разделение stdout и stderr для сценария (т. Е. Сценарии stdout и stderr можно перенаправлять отдельно.

0 голосов
/ 15 января 2009

Почему бы просто не перенаправить его только на прогон проги?

   progname > ./tmp/run.txt 2>/dev/null && run_status='OK'

Или, возможно,

{
   progname > ./tmp/run.txt && run_status='OK'
} 2>/dev/null
...