Что более идиоматично в сценарии bash: `|| true` или `|| : `?

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

Не нулевой возврат из команды в любом подмодуле приводит к завершению обработки. Это можно переопределить, добавив || : || : до конца команды.

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

true не было встроено в оболочку Bourne. : всегда было (это был способ ввода комментариев до появления # ).

Это, и потому, что оно короче, это, вероятно, основная причина, по которой люди предпочитают : по true .

Обратите внимание на другую разницу в оболочках POSIX (для bash , только в режиме POSIX): в то время как true является регулярным встроенным (даже не нужно встроить),: это специальный встроенный. Это имеет несколько последствий, большинство из которых вряд ли окажут какое-либо влияние в данном конкретном случае:

  • Если команда a : не работает, в том числе из-за неудачного перенаправления, это приводит к завершению работы оболочки. На практике это, вероятно, не изменит ситуацию, если вы не передадите перенаправления на :

     $ 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 || 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 || : false || : отменяет set -e и устанавливает статус выхода на 0 поэтому более идиоматично говорить, что мы хотим игнорировать код выхода сбоя команды. Большинство утверждают, что || true || true более разборчива (более четко отражает намерение).

Как правило, в bash двоеточие : и true эквивалентна.

Является ли || : считается более идиоматичным?

Я думаю, что он основан на контексте .

Если вы хотите получить return value или 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 

Большинство из этих ответов не учитывают наиболее распространенное использование :

Во-первых, это обсуждение не связано ни с одной оболочкой, которая не является производной оболочки Бурна. Тем не менее, все производные оболочки Бурна видят true и : как одно и то же. Программистам было рекомендовано использовать : вместо true потому что : всегда является встроенным, в то время как раньше были случаи, когда true не всегда был встроенным.

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