Родительская ловушка видна, но не запускается подоболочкой

Протестировано для 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), но не выполняет их.


Что здесь происходит?


person Marcus Rossel    schedule 22.03.2019    source источник
comment
Похоже, вы используете bash 3.2; во всяком случае, более поздние версии bash движутся в противоположном направлении, выполняя ловушку для echo "$(a)" и (a). (Это остается верным в текущем выпуске 5.0.3.)   -  person chepner    schedule 22.03.2019
comment
Я тестировал его для Bash 3.2.57 и Bash 5.0.2. Тот же результат для меня.   -  person Marcus Rossel    schedule 22.03.2019
comment
Хм, я не вижу унаследованной ловушки для (a) в 3.2.37.   -  person chepner    schedule 22.03.2019


Ответы (2)



Похоже, вы читаете старую версию спецификации. В самом последнем,

Когда вводится подоболочка, ловушки, которые не игнорируются, должны быть установлены на действия по умолчанию, за исключением случая подстановки команды, содержащей только одну команду ловушки, когда ловушки не нужно изменять.

person chepner    schedule 22.03.2019
comment
Собственно, я в этом не уверен. Он указывает некоторое исключение для подстановок команд, но пример в спецификации на самом деле не соответствует текущему случаю, а также не объясняет, почему (a) также наследует ловушку. - person chepner; 22.03.2019