Históricamente , los shells Bourne no tenían true
y false
como comandos incorporados. true
en su lugar, simplemente se le asignó un alias :
y false
algo parecido let 0
.
:
es un poco mejor que la true
portabilidad 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 else
cláusula de la if
declaración como el único medio para bifurcar según el estado de salida:
if command; then :; else ...; fi
Dado que if
requiere una then
clá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 true
más fácil de leer. Sin embargo, hay una diferencia interesante: :
es un llamado POSIX integrado especial , mientras que true
es 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 true
en 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.