Выполнение (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)
?false
не позволяет вам установить код состояния, и нет никакой гарантии относительно того, какой ненулевой статус он возвращает. (2)false
обычно не является встроенным, поэтому требует дочернего процесса; напротив, большинство снарядов могут избежать порождения ребенка для обработки(exit 1)
.Насколько я понимаю, для этого нет цели, нет ничего, чего можно достичь напрямую, запустив подоболочку, а затем немедленно выйдя из нее.
Подобные вещи, скорее всего, являются побочным эффектом автоматической генерации кода - в некоторых случаях могут быть другие команды, выполняемые в подоболочке, где это
exit 1
имеет смысл. В конечном счете, есть хороший шанс, что код генерации каким-то образом упростится, позволяя ему вставлять некоторые операторы, которые в некоторых случаях не имеют никакой функции, и генерировать «чистый код» каждый раз сложнее. Либо тот, либо код, сгенерировавший выше, просто плохо написан :)Либеральное использование
{...}
является еще одним примером этого, большинство из них являются избыточными, но легче написать код, который вставляет их в каждом случае (может быть, в некоторых вы хотите перенаправить вывод / ввод блока), а не различать те, где они не нужны, и опустите их.источник
(exit 1)
это простой, возможно, самый простой способ получить определенный код выхода (в частном случае 1, конечно, есть более простые способы). Но это не причина в этом случае, поскольку код выхода не проверяется.Цель
exit
добавления подоболочки может состоять в том, чтобы не выходить из скрипта (хотя и использует exit для генерации определенного кода выхода).источник