Historicamente , os reservatórios Bourne não tinham true
e false
como comandos embutidos. true
era simplesmente um alias para :
, e false
para algo parecido let 0
.
:
é ligeiramente melhor do que true
a portabilidade para conchas antigas derivadas de Bourne. Como um exemplo simples, considere não ter o !
operador de pipeline nem o ||
operador de lista (como foi o caso de algumas conchas Bourne antigas). Isso deixa a else
cláusula da if
declaração como o único meio de ramificação com base no status de saída:
if command; then :; else ...; fi
Como if
requer uma then
cláusula não vazia e os comentários não contam como não vazios, :
serve como não operacional.
Hoje em dia (ou seja: em um contexto moderno), geralmente você pode usar um :
ou outro true
. Ambos são especificados pelo POSIX, e alguns acham true
mais fácil de ler. No entanto, há uma diferença interessante: :
é o chamado embutido especial POSIX , enquanto o embutidotrue
é regular .
É necessário que os embutidos especiais sejam incorporados ao shell; Os embutidos regulares são apenas "tipicamente" embutidos, mas não são estritamente garantidos. Normalmente, não deve haver um programa regular nomeado :
com a função true
PATH na maioria dos sistemas.
Provavelmente a diferença mais crucial é que, com embutidos especiais, qualquer variável definida pelo embutido - mesmo no ambiente durante uma simples avaliação de comando - persiste após a conclusão do comando, conforme demonstrado aqui usando o ksh93:
$ unset x; ( x=hi :; echo "$x" )
hi
$ ( x=hi true; echo "$x" )
$
Observe que o Zsh ignora esse requisito, assim como o GNU Bash, exceto quando opera no modo de compatibilidade com POSIX, mas todos os outros shells principais "derivados do POSIX sh" observam isso, incluindo dash, ksh93 e mksh.
Outra diferença é que os embutidos regulares devem ser compatíveis com exec
- demonstrado aqui usando o Bash:
$ ( exec : )
-bash: exec: :: not found
$ ( exec true )
$
O POSIX também observa explicitamente que :
pode ser mais rápido que true
, embora esse seja, obviamente, um detalhe específico da implementação.