Що в ірландському сценарії більш ідіоматичне: `|| true` або `|| : `?


36

Я не роблю дуже багато сценаріїв оболонок, тому мене трохи здивувало, коли я читав документаціюgit submodule і побачив синтаксис, який вони використовували в цій документації:

Ненульове повернення команди в будь-якому підмодулі призводить до того, що обробка закінчується. Це можна змінити, додавши || :в кінець команди.

Мені довелося подивитися, що || :це скорочення для змушення команди успішно вийти. Кожен раз, коли мені довелося успішно зробити командний вихід, я використовував || true. Є чи || :вважається більш ідіоматичних?


Варто зауважити, що ||:(без місця) діє і в басі. Це робить те саме, що || :або || true.
Бруно Броноський

Відповіді:


38

trueне було вбудовано в оболонку Борна. :завжди був (це був спосіб вводити коментарі до того, як #було введено).

Це, а також тому , що це коротше типу, ймовірно , головна причина , люди вважають за краще :більше true.

Зауважте ще одну відмінність оболонок POSIX (бо bashлише в режимі POSIX): хоча trueце звичайний вбудований (навіть не має бути вбудований), :це спеціальний вбудований. Це має кілька наслідків, більшість з яких навряд чи матиме вплив у цьому конкретному випадку:

  • Якщо :команда не працює, в тому числі через невдале перенаправлення, це призводить до виходу оболонки. На практиці це, ймовірно, не змінить значення, якщо ви не перейдете до переадресації:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
  • в var=value :, varзалишається встановленим valueпісля :повернення, а не у випадку true:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1

Також відзначимо , що || trueроботи в оболонках rcі cshсімей , але не || :(але не скасувати set -eв csh).

|| :не те саме, що :. Це означає або працює :іншим чином (тобто якщо попередній трубопровід вийшов з ладу).

set -e
false

Може призвести до виходу оболонки через set -eі falseмає ненульовий (пошкоджений) статус виходу. set -eЕфект буде скасований , якщо команда , яка повертає ненульовий код виходу використовується в якості умови , як в:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :лише скасовує set -e. false || :скасовує set -eта встановлює статус виходу на 0так, ідіоматичніше сказати, що ми хочемо ігнорувати код виходу з ладу команди. Більшість заперечує, що || trueце є більш розбірливим (чіткіше передає намір).


5
&& :є геніальним, чи є якісь документи або додаткові читання з цього приводу? Google не вистачає на мене, намагаючись знайти такі ключові слова…
Ian Bytchek

5

Взагалі в баш, товста кишка :і trueрівнозначна.

Є || : вважається більш ідіоматичним?

Я думаю, що це базується на контексті .

Якщо ви хочете, щоб a return valueабо a conditionзавжди було вірним, вам слід скористатися trueключовим словом, це зробить ваш код більш чітким і дасть глядачам знати, що ви хочете підкреслити значення true , тобто:

while true; do something

або

<commnad>
RETURN_VALUE= $? || true

А якщо ви нічого не хочете робити , або NOPв оболонці, вам слід використовувати двокрапку:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

або

while conditon
do
    : # DO NOTHING HERE
done

5

Більшість цих відповідей не можуть вирішити найбільш поширене використання :.

По-перше, це обговорення не стосується жодної оболонки, яка не є похідною Bourne shell ( sh). Це означає, що всі похідні оболонки Борна бачать trueі :як те саме. Раніше програмістів рекомендували використовувати :замість true, тому що :це завжди вбудований, тоді як раніше були випадки, коли trueне завжди вбудований.

:має два варіанти використання. Це не синонім для #, але він має іншу функцію. Під час налагодження сценарію під а set -x, рядки, де #використовується, опускаються парсером і повністю ігноруються, тоді як рядки з :аналізуються та оцінюються. Це дійсно корисно при налагодженні, оскільки під -xцими рядками відображаються і відображається їх значення після оцінки. Це як введення printу ваш код заяви, які відображаються лише в -xрежимі. Будьте обережні зі значеннями після того, :як вони є реальним кодом, і побічні ефекти можуть вплинути на вашу програму.


1
Що таке друге використання?
Пітер Мортенсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.