Si escribo
::
en un bash shell, obtengo:
-bash: ::: command not found
Pero, solo uno no :
produce resultados. ¿Por qué es esto?
command-line
bash
NerdOfLinux
fuente
fuente
Respuestas:
El
:
shell incorporado frente a inexistente::
El
:
comando incorporado de shell existe (observe la diferencia entre los comandos externos e integrados ) que no hace nada; simplemente devuelve el éxito, al igual que eltrue
comando. El:
incorporado es estándar y está definido por el estándar POSIX , donde también se conoce como la "utilidad nula". Se usa con frecuencia para probar o para ejecutar bucles infinitos como enwhile : ; do ...;done
Sin embargo,
::
dos caracteres de dos puntos juntos se interpretan como una "palabra" para el shell, y se supone que es un comando que ingresó el usuario. El shell pasará por el proceso de verificación de las funciones integradas, luego cualquier directorio en laPATH
variable para la existencia de ese comando. Pero no hay un::
comando incorporado ni externo::
. Por lo tanto, eso produce un error.Bueno, ¿cuál es un formato típico para un error?
Por lo tanto, lo que ves no son 3 puntos sino lo que escribiste pegado en el formato de error estándar.
Tenga en cuenta también que
:
puede tomar argumentos de línea de comandos, es decir, es legal hacerlo:En este caso, el shell considerará eso como dos "palabras", una de las cuales es un comando y la otra un parámetro posicional. ¡Eso tampoco producirá ningún error! (Consulte también la nota histórica (más adelante en esta respuesta) sobre el uso de los
:
parámetros posicionales).En conchas que no sean bash
Tenga en cuenta que el formato también puede variar entre diferentes shells. Para
bash
,ksh
ymksh
el comportamiento es consistente. Por ejemplo, el/bin/sh
shell predeterminado de Ubuntu (que en realidad es/bin/dash
):donde 1 es el número de comando (equivalente al número de línea en un script).
csh
por el contrario no produce ningún mensaje de error:De hecho, si ejecuta
strace -o csh.trace csh -c ::
, la salida de rastreo en elcsh.trace
archivo revela quecsh
sale con el estado de salida 0 (sin errores). Perotcsh
genera el error (sin generar su nombre):Error de mensajes
En general, el primer elemento en el mensaje de error debe ser el proceso o la función de ejecución (su shell intenta ejecutarse
::
, por lo tanto, el mensaje de error proviene del shell). Por ejemplo, aquí el proceso de ejecución esstat
:De hecho, POSIX define la función perror () , que de acuerdo con la documentación toma un argumento de cadena, luego emite un mensaje de error después de dos puntos y luego una nueva línea. Citar:
Y el argumento de cadena para
perror()
técnicamente podría ser cualquier cosa, pero, por supuesto, para mayor claridad, generalmente es el nombre de la función oargv[0]
.Por el contrario, GNU tiene su propio conjunto de funciones y variables para el manejo de errores , que un programador puede usar
fprintf()
parastderr
transmitir. Como muestra uno de los ejemplos en la página vinculada, se podría hacer algo como esto:Nota historica
En el antiguo shell de Unix y Thompson,
:
se usaba con unagoto
declaración (que según el usuario llamado Perderabo en este hilo no era un shell incorporado). Cita del manual:Entonces, podría hacer algo como esto para hacer un script de bucle infinito:
fuente
command.com
y Windowscmd.exe
tienen una situación similar pero opuesta::
es explícitamente una etiqueta de goto (no un comando) y a menudo se reutiliza como un carácter de comentario (por ejemplo:: This is a comment
).Los dos puntos finales son solo parte del mensaje predeterminado "no encontrado":
La razón por la que un solo colon no produce nada es que
:
es un comando válido, aunque no hace nada (excepto el retornoTRUE
). De laSHELL BUILTIN COMMANDS
sección deman bash
:A veces lo verás en construcciones como
Ver por ejemplo ¿ Para qué sirve el colon incorporado?
fuente
Pruebe cualquier otro comando inexistente y verá que
:
cumple su propósito normal en inglés:fuente
Los dos puntos añadidos son parte del mensaje de error en sí. Si uno teclea
cd ow
, da como resultadobash: cd: ow: No such file or directory
, lo que muestra que el error está poniendo el colon extra: No such file or directory
fuente
el tercero es un espaciador del formateo
en bash a
:
es una instrucción vacía de línea vacíafuente
obtienes 3 puntos porque el formato de error contiene dos puntos:
fuente