¿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