Подоболочка с одним оператором, похоже, не наследует ловушку ERR при использовании set -o errtrace

Рассмотрим этот минимальный пример, который я запускаю как исполняемый файл.

#!/bin/bash
set -E
trap 'echo "ERR trap triggered"' ERR
(
  echo "hello" >/dev/null
  ls /root/
)

Обратите внимание на два сообщения-ловушки ERR в следующем выводе:

ls: cannot open directory '/root/': Permission denied
ERR trap triggered
ERR trap triggered

Однако, когда я заставляю подоболочку содержать один оператор, например:

#!/bin/bash
set -E
trap 'echo "ERR trap triggered"' ERR
(
  ls /root/
)

Я получаю только одно сообщение-ловушку ERR:

ls: cannot open directory '/root/': Permission denied
ERR trap triggered

Я надеялся, что кто-нибудь сможет объяснить мне причину разницы в выходе. Спасибо!


person jmrah    schedule 28.06.2020    source источник
comment
Это странно. Я всегда ожидал бы два сообщения, потому что ls предоставляет статус выхода, отличный от нуля, и, следовательно, также статус выхода подоболочки.   -  person Cyrus    schedule 29.06.2020
comment
Я считаю, что bash оптимизирует подоболочку, когда в подоболочке есть только одна (не-оболочка) команда.   -  person chepner    schedule 29.06.2020
comment
@chepner Я погуглил о твоих подозрениях и думаю, что ты прав. Кажется, есть определенные сценарии, в которых bash «оптимизирует» создание подоболочки. Я обновил свой вопрос с этой информацией.   -  person jmrah    schedule 29.06.2020
comment
Вы уже получили себе ответ, что вы спрашиваете сейчас?   -  person oguz ismail    schedule 29.06.2020
comment
@oguzismail, я отредактировал свой вопрос и добавил ответ ниже.   -  person jmrah    schedule 29.06.2020
comment
Однако вопрос не является дубликатом, даже несмотря на то, что основная причина вопроса указана в этой и других ссылках.   -  person jmrah    schedule 29.06.2020
comment
Руководство по переполнению стека на самом деле таково: если ответ один и тот же, вопросы можно рассматривать как дубликаты. Это настолько неясно, что я все еще думаю о том, чтобы закрыть как обман. Тот факт, что ваш ответ зависит от назначенного вопроса, является убедительным намеком на то, что этот вопрос должен быть закрыт как обман.   -  person tripleee    schedule 29.06.2020
comment
@tripleee спасибо, что указали на это определение дубликата. Я думал об этом. В таком случае я готов закрыть это как дубликат. Но как указать повторяющийся вопрос/ответ на unix.stackexchange.com?   -  person jmrah    schedule 29.06.2020
comment
Мы не можем ссылаться на межсайтовые дубликаты каким-либо официальным способом, просто связывайте их неофициально, как вы уже сделали. Закрытие этого как дубликата ничего не удалит как таковое (хотя закрытые вопросы могут быть удалены, если они получают очень мало трафика или если они будут понижены до чистой отрицательной оценки, что, я не думаю, произойдет с этим).   -  person tripleee    schedule 29.06.2020
comment
Для справки, это может быть повторно открыто, если три обычных пользователя с правами на повторное голосование потребуют повторного открытия, или если я или другой владелец золотого значка (или модификатор) решит повторно открыть его.   -  person tripleee    schedule 29.06.2020


Ответы (1)


Я отвечаю на свой вопрос для закрытия.

Причина, по которой это происходит, заключается в том, что Bash не создает подоболочку в определенных сценариях в попытке оптимизации. Один из таких сценариев, когда Bash не будет создавать подоболочку, — это случай OP, когда подоболочка содержит одну простую команду.

Вот вопрос StackExchange, чьи ответы содержат более подробную информацию об этом поведении Bash.

Что касается документации, я повторю то, что есть в ответе Stackexchange. Единственная документация, которую я могу найти об этом поведении, находится в Bash исходный файл здесь

person jmrah    schedule 29.06.2020