Виконання (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)
?