Рассмотрим следующее (слегка глупое) имя сценария 'test1.sh':
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
Когда я запускаю его, я получаю не только вывод echo, но и сообщение bash о смерти сна на stderr:
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
В этом случае я хотел бы подавить распечатку в stderr. Я знаю, что могу сделать это в командной строке, как в:
$ ./test1.sh 2> /dev/null
... но есть способ , чтобы подавить его из в сценарии? (Я знаю, что могу обернуть его во второй скрипт и сделать так, чтобы оболочка перенаправила его, но должно быть что-то более простое ...)
bash
shell-script
stderr
fearless_fool
источник
источник
Ответы:
Вы правы; pkill не генерирует сообщение, bash есть. Вы предлагаете
это возможное решение. Как указывает UVV, эквивалентное действие внутри скрипта
Это перенаправляет stderr для сценария
/dev/null
из этого оператора, пока он не будет изменен обратно. Неуклюжие способы изменить это назад включаюткоторый перенаправляет stderr в терминал. Это вероятно (но не обязательно), где это было первоначально.
Или же
который устанавливает stderr таким же, как stdout, и, скорее всего, ошибается.
Более надежный способ
который сохраняет исходный stderr в файловом дескрипторе 3, а затем восстанавливает его.
Другие способы подавления только объявления о смерти процесса включают
а также
которые изменяют stderr только для сгруппированных команд.
источник
stdin
иstderr
созданием новых файловых дескрипторов, отправкой исходных дескрипторов/dev/null
и последующим их восстановлением?{ sleep 10 & pkill sleep;} 2> /dev/null
В соответствии с этим вы можете сделать что-то вроде следующего:
источник