En la respuesta a esta pregunta sobre los comentarios en las secuencias de comandos de shell , se indica que :
es un comando nulo que explícitamente no hace nada (pero no debe usarse para comentarios).
¿Cuál sería la utilidad de un comando que no hace absolutamente nada?
shell
shell-script
DQdlM
fuente
fuente
:
se requiere que sea incorporada, mientrastrue
que no lo es, lo que afecta el alcance de las variablesRespuestas:
Normalmente lo uso
true
en bucles; Creo que está más claro:El único lugar que he encontrado que
:
es realmente útil es en las declaraciones de casos, si necesita hacer coincidir algo pero no quiere hacer nada. Por ejemplo:fuente
true
por una condición,:
por un NOP.case a in a ) ;; esac
. ¿Hay algunas conchas que no aceptan esto?case ${var} in value);; *) do_something;; esac
es aceptable. El:
comando no es necesario para casos vacíos.Originalmente, se usaba para determinar que era un programa de shell Bourne, a diferencia del programa compilado en C. Esto fue antes de shebang y múltiples lenguajes de script (csh, perl). Todavía puede ejecutar un script que comience simplemente con
:
:Generalmente ejecutará el script contra
$SHELL
(o/bin/sh
).Desde entonces, el uso principal es evaluar los argumentos. Sigo usando:
para establecer un valor predeterminado en un script.
fuente
:
es útil para escribir bucles que deben terminarse desde dentro.Esto se ejecutará para siempre a menos que
break
oexit
se llame, o el shell reciba una señal de terminación.fuente
while true; do ...; done
comunica intenciones al lector mejor quewhile :; do ...; done
Cuando desee una declaración "a menos que" en el script de shell, use una condición "no", que puede parecer tonta para algunas de las pruebas, o use ':' en la cláusula verdadera, con código real en el falso- cláusula.
La "condición exótica" podría ser algo que no desea negar, o eso es mucho más claro si no utiliza la "lógica negativa".
fuente
autoconf
porque es mucho más fácil agregar un valor predeterminado:
para ramas vacías que averiguar cómo revertir la condición.!
frente[ some-exotic-condition ]
es tonto, pero un superfluo: else
después de que no es tonto.!
token niega un elemento de tubería de comando completo.while ! grep ... ; do ... done
oif ! [ ... ] ; then ... fi
. Es básicamente externo a latest/[]
sintaxis. Ver: pubs.opengroup.org/onlinepubs/9699919799/utilities/…Solo he usado esto además del carácter # para comentar temporalmente una línea, en una situación en la que comentar la línea produce un error de sintaxis, debido a un defecto en la gramática del shell de no permitir una secuencia vacía de comandos :
Sin el: nos falta una secuencia de comandos, que es un error de sintaxis.
fuente
Hay dos casos en los que me parece
:
útil:Asignaciones de variables predeterminadas
Esta es una manera conveniente de permitir a los usuarios de su script de shell anular una configuración sin editar el script. (Sin embargo, los argumentos de la línea de comandos son mejores porque no corre el riesgo de un comportamiento inesperado si el usuario coincide con la variable que usa en su entorno exportado). Así es como el usuario anularía la configuración:
La
${VAR=value}
sintaxis dice establecerVAR
envalue
si aúnVAR
no está establecida, luego expandir al valor de la variable. Como todavía no nos importa el valor de la variable, se pasa como un argumento al comando no-op:
para descartarla.Aunque
:
es un comando no:
operativo, el shell realiza la expansión (¡no el comando!) Antes de ejecutar el:
comando, por lo que la asignación de variables aún ocurre (si corresponde).También sería aceptable usar
true
o algún otro comando en lugar de:
, pero el código se vuelve más difícil de leer porque la intención es menos clara.El siguiente script también funcionaría:
Pero lo anterior es mucho más difícil de mantener. Si
${VAR}
se agrega una línea usando encima de esaprintf
línea, se debe mover la expansión de asignación predeterminada. Si el desarrollador olvida mover esa tarea, se introduce un error.Algo para poner en un bloque condicional vacío
Los bloques condicionales vacíos generalmente deben evitarse, pero a veces son útiles:
Algunas personas argumentan que tener un
if
bloque verdadero vacío puede hacer que el código sea más fácil de leer que negar la prueba. Por ejemplo:es posiblemente más fácil de leer que:
Sin embargo, creo que hay algunos enfoques alternativos que son mejores que un bloque verdadero vacío:
Ponga la condición en una función:
Ponga la condición dentro de llaves (o paréntesis, pero los paréntesis generan un proceso de subshell y cualquier cambio realizado en el entorno dentro de la subshell no será visible fuera de la subshell) antes de negar:
Usar en
||
lugar deif
:Prefiero este enfoque cuando la reacción es simple, como afirmar condiciones:
fuente
En el antiguo caparazón previo a la perforación en versiones antiguas de UNIX, el
:
comando originalmente estaba destinado a especificar etiquetas paragoto
(era un comando separado que enrolla la entrada a donde se encuentra la etiqueta, por lo que las etiquetas no podrían ser una sintaxis separada para la que shell sabe que.if
también era un comando separado.) Pronto se usó para comentarios, antes de que hubiera una sintaxis de comentarios (#
se usó para retroceder) y en estos días existe la compatibilidad tanto como cualquier otra cosa.fuente
Además de usarlo como una declaración que no hace nada, puede usarlo para comentar declaraciones individuales convirtiéndolas en argumentos para:.
fuente
: echo write this line > myfile
que seguirá creando un archivo vacío.:
es un mecanismo de comentarios adecuado.