Выполнение (exit 1);- это самый простой способ вызвать ERRловушку. Это также вызовет немедленный выход, если set -eон действует. (Для запуска условия ошибки требуется команда для сбоя; exitпри значении ошибки в подоболочке происходит сбой подоболочки.)
exit 1; не будет делать ни одной из этих вещей.
Таким образом, {(exit 1); exit 1;}можно использовать сначала для создания ERRловушки, которая может сделать что-то полезное для целей отладки, а затем завершить сценарий с указанием ошибки.
Но это не то, что происходит в autoconfфайлах. autoconfсценарии полагаются на EXITловушку для очистки временных файлов, созданных во время выполнения. Большинство оболочек, в том числе bash, устанавливают статус из значения, указанного в exitкоманде, перед вызовом EXITпрерывания. Это может позволить EXITловушке определить, была ли она вызвана из-за ошибки или нормального завершения, и это также позволяет ей убедиться, что состояние выхода правильно установлено в конце операции прерывания.
Однако, по-видимому, некоторые снаряды не взаимодействуют. Вот цитата из autoconfруководства :
Некоторые сценарии оболочки, например, созданные сценариями, autoconfиспользуют ловушку для очистки перед выходом. Если последняя команда оболочки вышла с ненулевым статусом, ловушка также выходит с ненулевым статусом, чтобы вызывающий мог сказать, что произошла ошибка.
К сожалению, в некоторых оболочках, таких как Solaris /bin/sh, ловушка выхода игнорирует аргумент команды выхода. В этих оболочках ловушка не может определить, была ли она вызвана простым выходом или выходом 1. Вместо прямого вызова выхода используйте AC_MSG_ERRORмакрос, который имеет обходной путь для этой проблемы.
Обходной путь должен убедиться, что он $?имеет статус выхода перед выполнением exitкоманды, так что он определенно будет иметь это значение при выполнении EXITловушки. И действительно, это AC_MSG_ERRORмакрос, который вставляет этот любопытный код, дополненный избыточными скобками.
falseвместо(exit 1)?