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 :,varpermanece definido comovalueapó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).