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>:.txt
y 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 true
no son muy útiles, y devuelven lo mismo en bash
y dash
. ¿Hay alguna diferencia práctica entre ellos, excepto que :
ahorra tres bytes y hace que los scripts sean menos legibles?
Respuestas:
No hay una diferencia real en el comportamiento. Ambos comandos no hacen nada y salen con un estado exitoso.
:
enfatiza no hacer nada;true
enfatiza el estado exitoso.strace true
funciona porquetrue
es 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, intentaLas 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 diferenteseval.c
, pero no he podido producir ningún comportamiento visiblemente diferente. que la palabraspecial
en la salida detype :
.fuente
/bin/true
o/bin/false
. También el:
comando se utiliza a veces para los efectos secundarios de procesamiento argumento:: ${num_times:=10}
.:
Originalmente era un indicador de etiqueta , de vuelta en un antepasado del shell Bourne que teníagoto
. Aparentemente:
fue abusado como un indicador de comentario y atascado.:
como un indicador de etiqueta para goto se conservó en el clon de línea de comando pseudo-Unix de Microsoftcommand.com
, y permanece en su sucesorcmd.exe
, al igual que la práctica de abusar::
de un comentario de línea.Son idénticos en Bash. Mire
builtins/colon.def
en el código fuente Bash-4.2.En su comando
strace true
, en realidad está ejecutando el binario en/bin/true
lugar del bash incorporado true.fuente