¿Cuál es la diferencia entre: y verdadero?

15

En bash:

$ type :
: is a shell builtin
$ type true
true is a shell builtin

Parece que son iguales, pero no dan la misma traza del sistema:

$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0)                           = ?

Intenté diferir strace bash -c : 2>:.txty strace bash -c true 2>true.txt, pero no pude encontrar ninguna diferencia entre ellos, excepto por las ubicaciones de memoria.

En dash:

$ type :
: is a special shell builtin
$ type true
true is a shell builtin

OK, entonces no son lo mismo. help :y help trueno son muy útiles, y devuelven lo mismo en bashy dash. ¿Hay alguna diferencia práctica entre ellos, excepto que :ahorra tres bytes y hace que los scripts sean menos legibles?

l0b0
fuente

Respuestas:

27

No hay una diferencia real en el comportamiento. Ambos comandos no hacen nada y salen con un estado exitoso. :enfatiza no hacer nada; trueenfatiza el estado exitoso.

strace truefunciona porque truees un shell incorporado y un comando externo ( /bin/true); :es solo un shell incorporado (no existe /bin/:, aunque podría haberlo, y probablemente estaba en sistemas Unix muy antiguos). En bash, intenta

type -a :
type -a true

Las razones por las que ambos existen son históricas. Si recuerdo correctamente, algunos shells muy tempranos no tenían una sintaxis de comentario, por lo que :se utilizó el comando no hacer nada .

Hay alguna diferencia interna en dash. Mirando a través de la fuente, disponible en git: //git.kernel.org/pub/scm/utils/dash/dash.git, muestra algunas rutas de código diferentes eval.c, pero no he podido producir ningún comportamiento visiblemente diferente. que la palabra specialen la salida de type :.

Keith Thompson
fuente
8
Además, las primeras versiones de UNIX no tenían /bin/trueo /bin/false. También el :comando se utiliza a veces para los efectos secundarios de procesamiento argumento: : ${num_times:=10}.
Arcege
55
:Originalmente era un indicador de etiqueta , de vuelta en un antepasado del shell Bourne que tenía goto. Aparentemente :fue abusado como un indicador de comentario y atascado.
Gilles 'SO- deja de ser malvado'
1
El comportamiento de :como un indicador de etiqueta para goto se conservó en el clon de línea de comando pseudo-Unix de Microsoft command.com, y permanece en su sucesor cmd.exe, al igual que la práctica de abusar ::de un comentario de línea.
Sorpigal
8

Son idénticos en Bash. Mire builtins/colon.defen el código fuente Bash-4.2.

En su comando strace true, en realidad está ejecutando el binario en /bin/truelugar del bash incorporado true.

Jodie C
fuente