Обычно используют set -euo pipefail и trap на EXIT для очистки. Но errexit имеет исключения, поэтому критичные ошибки и команды в условных конструкциях нужно проверять явно.
Как написать Bash-скрипт так, чтобы при ошибке команды он завершался с ошибкой, а созданные временные файлы удалялись? Какие опции set и механизм trap используете?
Обычно используют set -euo pipefail и trap на EXIT для очистки. Но errexit имеет исключения, поэтому критичные ошибки и команды в условных конструкциях нужно проверять явно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Обычно используют set -euo pipefail и trap на EXIT для очистки. Но errexit имеет исключения, поэтому критичные ошибки и команды в условных конструкциях нужно проверять явно.
#!/usr/bin/env bash
set -euo pipefail
job_tmp=$(mktemp) || exit 1
cleanup() {
status=$?
trap - EXIT
rm -f -- "$job_tmp" || :
exit "$status"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
some_command > "$job_tmp"
-u обнаруживает необъявленные переменные, pipefail учитывает сбои звеньев pipeline. -e не срабатывает во всех контекстах, например в ряде проверок if и цепочек &&. SIGKILL перехватить нельзя. Удаляется только конкретный файл, созданный mktemp.
Источник: www.gnu.org.