Historicamente , os reservatórios Bourne não tinham truee falsecomo comandos embutidos. trueera simplesmente um alias para :, e falsepara algo parecido let 0.
:é ligeiramente melhor do que truea 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 elsecláusula da ifdeclaração como o único meio de ramificação com base no status de saída:
if command; then :; else ...; fi
Como ifrequer uma thenclá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 truemais 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 truePATH 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.