LINUX.ORG.RU

bash: отловить ошибку в subshell

 


0

2

Приветствую

Я хочу отлавливать ошибки через trap. Использую следующий код:

function handle_fail() {
	local cmd="$BASH_COMMAND" function="${FUNCNAME[1]}" exitcode="$?"

	printf 'in %s: command '\''%s'\'' failed with exit-code %s\n' "$function" "$cmd" "$exitcode" >&2
	exit 1
}

set -o pipefail
trap handle_fail ERR

Но ошибка не отлавливается, если она допущена в subshell:

echo < <(false) # `false` возвращает 1 в subshell
echo 'DONE'     # будет выведено DONE

# Конкретный юзкейс: если find сфейлится, скрипт продолжит работать
readarray -t file_list < <(find -- "$__DIR__/data" -type f -printf '%P\n')

С помощью set -e сработает, но хочется иметь свою функцию handle_fail(), которая работала бы в т.ч. с subshell-ами. Возможно ли это?

Возможно ли это?

Даже если б trap и не ресетился, то всё равно в этом не было бы никакого смысла, ибо exit был бы у сопроцесса, а вывести сообщение и так возможно по ||. Но если уж очень хочется, у вас всегда есть возможность использовать стандартные средства по взаимодействию процессов — посылка сигналов, которые можно отлавливать trap.

vodz ★★★★ ()