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
это более разборчиво (передает намерение более четко).
||:
(без пробела) также действует в bash. Он делает то же самое, что и|| :
или|| true
.