Históricamente , los shells Bourne no tenían truey falsecomo comandos incorporados. trueen su lugar, simplemente se le asignó un alias :y falsealgo parecido let 0.
:es un poco mejor que la trueportabilidad a las antiguas conchas derivadas de Bourne. Como un ejemplo simple, considere no tener ni el !operador de la tubería ni el ||operador de la lista (como fue el caso de algunas conchas de Bourne antiguas). Esto deja la elsecláusula de la ifdeclaración como el único medio para bifurcar según el estado de salida:
if command; then :; else ...; fi
Dado que ifrequiere una thencláusula no vacía y los comentarios no cuentan como no vacíos, :sirve como no operativo.
Hoy en día (es decir: en un contexto moderno) generalmente puede usar cualquiera :o true. Ambos están especificados por POSIX, y algunos encuentran truemás fácil de leer. Sin embargo, hay una diferencia interesante: :es un llamado POSIX integrado especial , mientras que truees un incorporado normal .
Se requieren incorporaciones especiales para integrarse en el shell; Las incorporaciones regulares solo están incorporadas "típicamente", pero no están estrictamente garantizadas. Por lo general, no debería haber un programa normal denominado :con la función trueen PATH de la mayoría de los sistemas.
Probablemente, la diferencia más crucial es que con las funciones integradas especiales, cualquier variable establecida por la función incorporada, incluso en el entorno durante la evaluación de comandos simples, persiste después de que se completa el comando, como se demuestra aquí usando ksh93:
$ unset x; ( x=hi :; echo "$x" )
hi
$ ( x=hi true; echo "$x" )
$
Tenga en cuenta que Zsh ignora este requisito, al igual que GNU Bash, excepto cuando se opera en modo de compatibilidad POSIX, pero todos los demás shells principales "derivados de POSIX sh" lo observan, incluidos dash, ksh93 y mksh.
Otra diferencia es que las funciones integradas regulares deben ser compatibles con exec- demostradas aquí usando Bash:
$ ( exec : )
-bash: exec: :: not found
$ ( exec true )
$
POSIX también señala explícitamente que :puede ser más rápido que true, aunque esto es, por supuesto, un detalle específico de implementación.