Відповіді:
Причиною цього шаблону є те, що сценарії підтримки в пакетах Debian, як правило, починаються з цього set -e
, що призводить до того, що оболонка виходить, як тільки будь-яка команда (строго кажучи, конвеєр, список або команда з'єднання) закінчується зі статусом, що не має нуля. Це гарантує, що помилки не накопичуються: як тільки щось піде не так, сценарій припиняється.
У випадках, коли команді в скрипті дозволено виходити з ладу, додавання || true
гарантує, що отримана складова команда завжди закінчується з нульовим статусом, тому сценарій не перериває. Наприклад, видалення каталогу не повинно бути фатальною помилкою (запобігання видаленню пакету); тому ми б використали
rmdir ... || true
оскільки rmdir
не має можливості сказати це ігнорувати помилки.
set -e
а в цьому немає потреби || true
взагалі, я вважав важливим надати контекст. Якщо ви помітили дивні речі на POWER, я настійно рекомендую вам подавати помилки ( reportbug
)!
set -e
це не лише "Debian convention", але і хороша схема програмування, яку завжди слід використовувати. Побачити. наприклад, davidpashley.com/articles/writing-robust-shell-scripts
|| true
set -e - це ймовірний контекст і, ймовірно, найбільш поширений. Я кланяюся цій відповіді! Буквально, однак, корисно в будь-який час стан виходу вважається неактуальним І (як ви додаєте посилання на статтю), я не використовую статус виходу як частина мого контролю сценаріїв. Я бачу утиліту (in set -e
), але не пішла б так далеко, як це робиться в статті, і сказати "Кожен написаний сценарій повинен містити set -e вгорі". Це стиль програмування. "ЗАВЖДИ | Кожен" включає в себе власний набір пасток - ака - абсолютний спосіб: рішення диких карт ALWAYS
зрештою матимуть зворотну реакцію, так як - немає безкоштовних атракціонів.
set -e
поведінці. Для вас це може не мати значення, якщо ваші єдині цілі bash
та інші відносно недавні снаряди, які живуть /bin/sh
, але ситуація стає більш нюансовою, коли ви хочете підтримувати старі оболонки / системи.
set -e
поведінки оболонок Свена Маскека , хоча ця сторінка також документує багато історичних / давніх снарядів, які не мають значення сьогодні. Є також ці дві сторінки з більш вузьким сучасним фокусом (пошук "set -e"): сторінка "lintsh" , портативна документація на оболонку autoconf -> Обмеження підсторінки
Хоча це не впливає на вихід програми просто запуститись - це дозволяє дозволеному користувачеві продовжувати так, ніби все нормально.
Перефразувати: це маскує помилки статусу попередньої команди.
michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false
michael@x071:[/usr/sbin]cat /tmp/true.sh
#!/bin/sh
false || true
michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $?
0
set -e
і || true
корисність визначатиметься рисами та цілями програміст.
git remote remove foo || true
git remote add foo http://blah
- ми хочемо ігнорувати помилку, якщо пульт відсутній.
||:
це ще один ідіоматичний спосіб написання цього (:
це черговий запис у вбудованій таблиці, що вказує наtrue
- але гарантовано буде вбудованим навіть до Борна; що сказав, що для POSIX shtrue
також гарантовано бути вбудованим - значить, це більше лаконічності, ніж ефективності в навіть віддалені сучасності).