Протестировано для Bash 5.0.2
Согласно Справочному руководству по GNU Bash,
Bash выполняет раскрытие [подстановки команд], выполняя [эту] команду в среде подоболочки.
Согласно The Open Group Base Specifications Issue 6:
когда вводится подоболочка, ловушки, которые не игнорируются, устанавливаются на действия по умолчанию.
Итак, при запуске следующего скрипта:
function a {
trap -p EXIT
}
trap "echo 'parent'" EXIT
echo "$(a)"
(a)
trap - EXIT
echo 'exiting'
... я ожидал бы вывода:
exiting
... но вместо этого я получаю:
trap -- 'echo '\''parent'\''' EXIT
trap -- 'echo '\''parent'\''' EXIT
exiting
... означает, что функция a
- даже если она выполняется в подоболочке - видит команды ловушки родительской оболочки (через trap -p
), но не выполняет их.
Что здесь происходит?
bash
движутся в противоположном направлении, выполняя ловушку дляecho "$(a)"
и(a)
. (Это остается верным в текущем выпуске 5.0.3.) - person chepner   schedule 22.03.2019(a)
в 3.2.37. - person chepner   schedule 22.03.2019