Вы заметите, что ловушки срабатывают точно в соответствии со спецификацией.Это просто вывод из trap
, который является неожиданным.
Это особенность Bash 4.2 ( примечания к выпуску ):
b. Subshells begun to execute command substitutions or run shell functions or
builtins in subshells do not reset trap strings until a new trap is
specified. This allows $(trap) to display the caller's traps and the
trap strings to persist until a new trap is set.
Обычно люди принимают этокак должное.Рассмотрим этот совершенно неудивительный обмен Bash:
bash$ trap
trap -- 'foo' EXIT
trap -- 'bar' SIGINT
bash$ trap | grep EXIT
trap -- 'foo' EXIT
Теперь посмотрим на результат в других оболочках, таких как Dash, Ksh или Zsh:
dash$ trap
trap -- 'foo' EXIT
trap -- 'bar' INT
dash$ trap | grep EXIT
(no output)
Возможно, это более правильно, но я сомневаюсь, что многиелюди ожидают этого.