Игнорирование bash pipefail для кода ошибки 141
установка bash (через set -o pipefail
) позволяет скрипту завершиться ошибкой, если ненулевая ошибка поймана там, где есть ненулевая ошибка на любом шаге канала.
SIGPIPE
ошибки (код ошибки 141), где данные записываются в канал, который больше не существует.
есть ли способ установить bash игнорировать SIGPIPE
ошибки, или есть подход к написанию обработчика ошибок, который будет обрабатывать все коды состояния ошибки, но, скажем, 0 и 141?
например, в Python, мы можем добавить:
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
применить настройки по умолчанию для SIGPIPE
ошибки: игнорирование их (ср. МФ. http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-06/3823.html).
есть ли какой-то аналогичный вариант в bash?
3 ответов
на trap
команда позволяет указать команду для запуска при обнаружении сигнала. Чтобы проигнорировать сигнал, передайте пустую строку:
trap '' PIPE
я обрабатываю это на основе каждого трубопровода, лавируя на || if ...
инструкция для проглатывания кода выхода 141, но все еще пузырясь любые другие ошибки:
pipe | that | fails || if [[ $? -eq 141 ]]; then true; else exit $?; fi
Я не знаю, как это сделать для всего сценария. Это было бы рискованно в целом, так как нет никакого способа узнать, что детский процесс не вернулся по другой причине.
но вы можете сделать это на командной основе. The ||
оператор подавляет любые ошибки, возвращаемые первой командой, поэтому вы можете сделать что-то вроде:
set -e -o pipefail
(cat /dev/urandom || true) | head -c 10 | base64
echo 'cat exited with SIGPIPE, but we still got here!'