Игнорирование 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!'