true
não foi incorporado ao shell Bourne. :
sempre foi (foi a maneira de inserir comentários antes que #
fosse introduzido).
Isso, e porque é mais curto para digitar, é provavelmente a principal razão pela qual as pessoas preferem :
over true
.
Observe outra diferença em shells POSIX (para bash
, somente no modo POSIX): enquanto true
é um builtin regular (nem precisa ser construído), :
é um especial builtin. Isso tem algumas implicações, a maioria das quais é improvável que tenha algum impacto neste caso particular:
-
Se um comando
:
falhar, inclusive devido a um redirecionamento com falha, isso fará com que o shell saia. Na prática, isso provavelmente não fará diferença, a menos que você passe redirecionamentos para:
$ sh -c ': > / ; echo HERE' sh: 1: cannot create /: Is a directory $ sh -c 'true > /; echo HERE' sh: 1: cannot create /: Is a directory HERE
-
em
var=value :
,var
permanece definido comovalue
após:
retornar, não no caso detrue
:$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
Observe também que || true
funciona em shells das famílias rc
e csh
, mas não em || :
(mas não para cancelar set -e
in csh
).
|| :
não é o mesmo que :
. Isso significa ou executar :
caso contrário (isto é, se o pipeline anterior falhar).
set -e
false
Faria com que o shell saia devido a set -e
e false
tenha um status de saída diferente de zero (falha). O efeito set -e
é cancelado se o comando que retorna um status de saída diferente de zero for usado como condição , como em:
if false; then ...
while false; do ...
false && : ...
false || : ...
false && :
apenas cancela set -e
. false || :
cancela set -e
e define o status de saída para 0
, portanto, é mais idiomático dizer que queremos ignorar um código de saída de falha do comando. A maioria argumentaria que || true
é mais legível (transmite a intenção com mais clareza).