Busqué noop en bash (:), pero no pude encontrar ninguna buena información. ¿Cuál es el propósito exacto o el caso de uso de este operador?
Intenté seguir y funciona así para mí:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Por favor avíseme, cualquier caso de uso de este operador en tiempo real o en cualquier lugar donde sea obligatorio utilizarlo.
:
archivo integrado existe en bourne shell y ksh, así como en bash.:
en tldp.org/LDP/abs/html/special-chars.htmlRespuestas:
Está ahí más por razones históricas. El colon incorporado
:
es exactamente equivalente atrue
. Es tradicional usarlotrue
cuando el valor de retorno es importante, por ejemplo, en un ciclo infinito:Es tradicional usarlo
:
cuando la sintaxis del shell requiere un comando pero no tiene nada que hacer.El
:
incorporado se remonta al shell de Thompson , estaba presente en Unix v6 .:
era un indicador de etiqueta para lagoto
declaración de la cáscara de Thompson . La etiqueta puede ser cualquier texto, por lo que se:
duplica como indicador de comentario (si no haygoto comment
, entonces: comment
es efectivamente un comentario). El caparazón de Bourne no teníagoto
pero se mantuvo:
.Un modismo común que se usa
:
es: ${var=VALUE}
, que se establecevar
enVALUE
si estaba desarmado y no hace nada sivar
ya se configuró. Esta construcción solo existe en forma de sustitución de variable, y esta sustitución de variable debe ser parte de un comando de alguna manera: un comando sin operación sirve muy bien.Consulte también ¿ Para qué sirve el sistema de colon integrado? .
fuente
#
para comentarios (o#!/bin/sh
shebangs); el:
comando introdujo comentarios, y ay del programador ingenuo que hizo una bonita caja de estrellas en sus comentarios:: ****
(o, peor aún,: * * *
).: * * *
?:
es un comando, el shell aún tiene que procesar sus argumentos antes de que pueda descubrir que los:
ignora. En general, solo está haciendo que el shell haga un trabajo adicional al expandirse*
a una lista de archivos en el directorio actual; en realidad, no afectará el funcionamiento del script.set -e
. De todos modos, espero que todos podamos aceptar usar#
:)while : ; do ... ; done
si quiero un bucle infinito rápido y sucio. (Por lo general, hay unsleep
bucle y escribo Ctrl-C para eliminarlo)Lo uso para declaraciones if cuando comento todo el código. Por ejemplo, tienes una prueba:
pero desea comentar temporalmente todo lo que contiene:
Lo que hace que bash dé un error de sintaxis:
Bash no puede tener bloques vacíos (WTF). Entonces agregas un no-op:
o puede usar el no-op para comentar las líneas:
fuente
Si lo usa,
set- e
entonces|| :
es una excelente manera de no salir del script si ocurre una falla (lo hace explícitamente aprobado).fuente
|| :
y luego manejar el error usted mismo con unexit 0
le permitirá mostrar todos los stdout y stderr en la ventana de la aplicación durante la depuración. Considere{ foo ... 2>&1; } || :
qué es mucho más simple que configurar trampas más complejas y si-entonces.Lo usaría
:
para proporcionar un comando que tiene éxito pero no hace nada. En este ejemplo, el comando "verbosidad" está desactivado de forma predeterminada, configurándolo en:
. La opción 'v' lo enciende.fuente
$(verbosity $i)
último (y condicionalmente) no hace nada.Ignorar
alias
argumentosAlgunas veces querrás tener un alias que no acepte ningún argumento. Puedes hacerlo usando
:
:fuente
:
funciona, desafortunadamente. El ejemplo que proporcionó parece redundante.#
#
haría que todo lo que venga sintácticamente después en la misma línea sea ignorado. Esto es realmente diferente (consideremy_alias arg ; other_command
o, a la inversa,my_alias arg1 {BACKSLASH}{NEWLINE} arg2
), y probablemente no sea lo que desea, ya que puede causar errores de sintaxis (adivine qué haráwhile my_alias ; do true ; done
owhile true ; do my_alias ; done
hará).Un uso es como comentarios de varias líneas o para comentar parte de su código con fines de prueba usándolo junto con un archivo here.
No olvides usar comillas
EOF
para que el código interno no sea evaluado, como$(foo)
. También podría ser digno de usar un nombre terminador intuitiva comoNOTES
,SCRATCHPAD
oTODO
.fuente
Dos míos.
Insertar comentarios de POD
Una aplicación bastante original de
:
es para incrustar comentarios de POD en scripts bash , de modo que las páginas de manual se puedan generar rápidamente. Por supuesto, uno eventualmente volvería a escribir todo el script en Perl ;-)Enlace de función en tiempo de ejecución
Se trata de una especie de patrón de código para vincular funciones en tiempo de ejecución. Fi, tenga una función de depuración para hacer algo solo si se establece una determinada bandera:
Usted obtiene:
fuente
A veces, las cláusulas de no operación pueden hacer que su código sea más legible.
Eso puede ser una cuestión de opinión, pero aquí hay un ejemplo. Supongamos que ha creado una función que funciona tomando dos rutas de Unix. Calcula la 'ruta de cambio' necesaria para cambiar de una ruta a otra. Usted coloca una restricción en su función de que las rutas deben comenzar con '/' O ambas no deben comenzar.
Algunos desarrolladores querrán eliminar el no-op, pero eso significaría negar el condicional:
Ahora, en mi opinión, no está tan claro en la cláusula if las condiciones en las que querría omitir la función. Para eliminar el no-op y hacerlo claramente, querrá mover la cláusula if fuera de la función:
Eso se ve mejor, pero muchas veces no podemos hacer esto; queremos que la verificación se realice dentro de la función.
Entonces, ¿con qué frecuencia sucede esto? No muy seguido. Quizás una o dos veces al año. Ocurre con bastante frecuencia, por lo que debes estar al tanto. No evito usarlo cuando creo que mejora la legibilidad de mi código (independientemente del idioma).
fuente
:
, debe usar:
, notrue
, en la respuesta. Dicho esto, la manera más fácil para negar la condición aquí es utilizar un solo[[ ... ]]
comando y como prefijo!
:if ! [[ ( ... && ... ) || ( ... && ... ) ]]; then
.: ${...=...}
podría decirse que tiene un aspecto menos incómodo quetrue ${...=...}
. Algunos también pueden preferirwhile :; do
hacerlowhile true; do
por ser conciso.Algo relacionado con esta respuesta , encuentro que esta no-operación es bastante conveniente para hackear scripts políglotas . Por ejemplo, aquí hay un comentario válido tanto para bash como para vimscript:
Claro, es posible que lo hayamos usado
true
igual de bien, pero al:
ser un signo de puntuación y no una palabra irrelevante en inglés, queda claro que es un símbolo de sintaxis.En cuanto a por qué alguien haría algo tan complicado como escribir una secuencia de comandos políglota (además de ser genial): resulta útil en situaciones en las que normalmente escribiríamos varios archivos de secuencia de comandos en varios idiomas diferentes, con el archivo
X
haciendo referencia a archivoY
.En tal situación, la combinación de ambos scripts en un solo archivo políglota evita cualquier trabajo
X
para determinar la ruta aY
(es simplemente"$0"
). Más importante aún, hace que sea más conveniente moverse o distribuir el programa.Un ejemplo común. Existe un problema bien conocido y de larga data con shebangs: la mayoría de los sistemas (incluidos Linux y Cygwin) permiten que solo se pase un argumento al intérprete. El siguiente shebang:
disparará el siguiente comando:
y no el previsto:
Por lo tanto, terminaría escribiendo un script de envoltura, como:
Aquí es donde entra en escena la poliglosia.
Un ejemplo más específico. Una vez escribí un script bash que, entre otras cosas, invocaba a Vim. Necesitaba darle a Vim una configuración adicional, lo que podría hacerse con la opción
--cmd "arbitrary vimscript command here"
. Sin embargo, esa configuración era sustancial, por lo que incluirla en una cadena habría sido terrible (si es que alguna vez fue posible). Por lo tanto, una mejor solución fue escribirlo en extenso en algún archivo de configuración, luego hacer que Vim lea ese archivo con-S "/path/to/file"
. Por lo tanto, terminé con un archivo bash / vimscript políglota.fuente
También he usado en él scripts para definir variables predeterminadas.
fuente
suponga que tiene un comando que desea encadenar al éxito de otro:
pero ahora desea ejecutar los comandos de forma condicional y desea mostrar los comandos que se ejecutarían (ejecución en seco):
por lo que si configura DEBUG y NOEXEC, el segundo comando nunca aparece. esto se debe a que el primer comando nunca se ejecuta (porque NOEXEC no está vacío) pero la evaluación de ese hecho lo deja con un retorno de 1, lo que significa que el comando subordinado nunca se ejecuta (pero lo desea porque es un ensayo). así que para solucionar esto, puede restablecer el valor de salida que queda en la pila con un noop:
fuente