Виконання (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, пастка виходу ігнорує аргумент команди exit. У цих оболонках пастка не може визначити, чи викликано її простим виходом чи виходом 1. Замість виклику виходу безпосередньо використовуйте AC_MSG_ERRORмакрос, який має вирішення для цієї проблеми.
Вирішення завдання полягає в тому, щоб переконатися, що він $?має статус виходу перед виконанням exitкоманди, так що воно обов'язково матиме це значення при виконанні EXITпастки. І справді, саме AC_MSG_ERRORмакрос вводить цей цікавий код, доповнений зайвими дужками.
falseзамість цього(exit 1)?