bash shell noop

¿Cuál es el caso de uso de noop[:] en bash?



shell (8)

Ignorar argumentos alias

Algunas veces quiere tener un alias que no tome ningún argumento. Puedes hacerlo usando:

> alias alert_with_args=''echo hello there'' > alias alert=''echo hello there;:'' > alert_with_args blabla hello there blabla > alert blabla hello there

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 usarlo.


A veces, las cláusulas no opcionales pueden hacer que tu 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 Unix. Calcula la ''ruta de cambio'' necesaria para crear un CD de una ruta a otra. Usted pone una restricción en su función que las rutas deben comenzar con un ''/'' O ambas no deben.

function chgpath() { # toC, fromC are the first characters of the argument paths. if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]] then true # continue with function else return 1 # Skip function. fi

Algunos desarrolladores querrán eliminar el no-op pero eso significaría negar el condicional:

function chgpath() { # toC, fromC are the first characters of the argument paths. if [[ "$toC" != / || "$fromC" == / ]] && [[ "$toC" == / || "$fromC" != / ]] then return 1 # Skip function. fi

Ahora, en mi opinión, no está tan claro en la cláusula if las condiciones en las que te gustaría omitir la función. Para eliminar el no-op y hacerlo con claridad, le conviene mover la cláusula if de la función:

if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]] then cdPath=$(chgPath pathA pathB) # (we moved the conditional outside)

Eso se ve mejor, pero muchas veces no podemos hacer esto; queremos que la verificación se haga dentro de la función.

Entonces, ¿con qué frecuencia sucede esto? No muy seguido. Tal vez una o dos veces al año. Sucede con suficiente frecuencia, que deberías ser consciente de ello. No rehúso usarlo cuando creo que mejora la legibilidad de mi código (independientemente del idioma).


Dos de los míos

Incrustar comentarios POD

Una aplicación bastante funky de : es para incrustar comentarios POD en scripts bash , para que las páginas man puedan generarse rápidamente. Por supuesto, uno eventualmente reescribiría todo el guión en Perl ;-)

Encuadernación de la ejecución

Este es un tipo de patrón de código para funciones de enlace en tiempo de ejecución. Fi, tiene una función de depuración para hacer algo solo si se establece una determinada bandera:

#!/bin/bash # noop-demo.sh shopt -s expand_aliases dbg=${DBG:-''''} function _log_dbg { echo >&2 "[DBG] $@" } log_dbg_hook='':'' [ "$dbg" ] && log_dbg_hook=''_log_dbg'' alias log_dbg=$log_dbg_hook echo "Testing noop alias..." log_dbg ''foo'' ''bar''

Usted obtiene:

$ ./noop-demo.sh Testing noop alias... $ DBG=1 ./noop-demo.sh Testing noop alias... [DBG] foo bar


Está allí más por razones históricas. El colon incorporado : es exactamente equivalente a true . Es tradicional usar true cuando el valor de retorno es importante, por ejemplo, en un ciclo infinito:

while true; do echo ''Going on forever'' done

Es tradicional de usar : cuando la sintaxis del shell requiere un comando pero no tienes nada que hacer.

while keep_waiting; do : # busy-wait done

Las fechas incorporadas hasta el shell de Thompson , estaban present en Unix v6 . : era un indicador de etiqueta para la declaración goto del shell de Thompson. La etiqueta puede ser cualquier texto, por lo que : dobla como un indicador de comentario (si no hay un goto comment , entonces : comment es efectivamente un comentario). El shell Bourne no tenía goto sino que se mantenía :

Una expresión común que utiliza : es : ${var=VALUE} , que establece var en VALUE si no se ajustó y no hace nada si var ya se configuró. Esta construcción solo existe en la forma de una sustitución de variable, y esta sustitución de variable necesita ser parte de un comando de alguna manera: un comando no operativo sirve muy bien.

Vea también ¿ Para qué sirve el edificio incorporado? .


Lo uso para declaraciones if cuando hago comentarios sobre todo el código. Por ejemplo, tienes una prueba:

if [ "$foo" != "1" ] then echo Success fi

pero quieres comentar temporalmente todo lo contenido dentro de:

if [ "$foo" != "1" ] then #echo Success fi

Lo que hace que bash dé un error de sintaxis:

line 4: syntax error near unexpected token `fi'' line 4: `fi''

Bash no puede tener bloques vacíos (WTF). Entonces agregas un no-op:

if [ "$foo" != "1" ] then #echo Success : fi

o puede usar el no-operativo para comentar las líneas:

if [ "$foo" != "1" ] then : echo Success fi


Si usa set- e entonces || : || : es una forma excelente de no salir del script si ocurre un error (lo hace explícitamente).


Un uso es como comentarios de líneas múltiples, o para comentar una parte de su código con fines de prueba al usarlo junto con un archivo aquí.

: << ''EOF'' This part of the script is a commented out EOF

No olvides utilizar comillas alrededor de EOF para que no se evalúe ningún código en el interior, como $(foo) . También podría valer la pena utilizar un nombre de terminación intuitivo como NOTES , SCRATCHPAD o TODO .


Utilizarías : para proporcionar un comando que tenga éxito pero no haga nada. En este ejemplo, el comando "verbosity" está desactivado de manera predeterminada, configurándolo en : La opción ''v'' lo enciende.

#!/bin/sh # example verbosity=: while getopts v OPT ; do case $OPT in v) verbosity=/bin/realpath ;; *) exit "Cancelled" ;; esac done # `$verbosity` always succeeds by default, but does nothing. for i in * ; do echo $i $($verbosity $i) done $ example file $ example -v file /home/me/file