- En el shell,
: es un comando nulo (null command) que no hace nada y solo evalúa sus argumentos; combinado con la expansión de parámetros permite manejar de forma concisa la validación de argumentos obligatorios y la asignación de valores por defecto
: "${1:?missing argument, aborting!}" hace que, si $1 no existe o está vacío, se imprima un mensaje de diagnóstico en stderr y se termine con un estado distinto de 0
- Si pasas
${VAR:=default} como argumento de :, la expansión se ejecuta pero la cadena resultante se descarta, así que no se intenta ejecutar el resultado como comando y solo se asigna el valor por defecto
: también puede usarse para vaciar archivos y verificar accesibilidad mediante redirección, como comando vacío en trap, para comprobar variables con set -u, y en ramas condicionales vacías
: "${VAR:=default}" escribe el nombre de la variable una sola vez, reduciendo la posibilidad de errores tipográficos, y en while : funciona como una condición que siempre tiene éxito para expresar un bucle infinito
Comando nulo y expansión de parámetros
: es un comando integrado de comando nulo que evalúa sus argumentos y luego descarta el resultado
- Se remonta hasta el Thompson shell de 1971, donde también se usaba como etiqueta y como el primer marcador de comentarios de Unix
- En lugar de un condicional de cuatro líneas, puedes validar un argumento obligatorio con esta sola línea
: "${1:?missing argument, aborting!}"
echo "Hello $1!"
- La sintaxis de expansión de parámetros
${name:?diagnostic} comprueba si $name no está definido o está vacío
- Si no tiene valor, imprime
diagnostic en stderr y termina el shell con un estado distinto de 0
- Si tiene valor, produce el mismo resultado que
$name
- Si ejecutas
${HELLO:=123} sin el comando nulo, el resultado de la expansión, 123, se trata como un comando y provoca command not found
: ${HELLO:=123} evalúa la expansión, asigna HELLO=123 y luego descarta el resultado
: "${DATA_DIR:=/var/data}" reduce la posibilidad de un error tipográfico como DATA_DRI porque, a diferencia de DATA_DIR="${DATA_DIR:-/var/data}", solo escribe una vez el nombre de la variable
Formas de aprovechar :
-
Asignar valores por defecto
- Asigna valores por defecto a variables mientras descarta el resultado de la expansión sin ejecutarlo como comando
: "${DATA_DIR:=/var/data}"
: "${RETRIES:=3}"
-
Vaciar archivos y verificar acceso
- Combinado con redirección, puede vaciar uno o más archivos
: > error.log
: > error.log > access.log
- También puedes comprobar si un archivo puede leerse o escribirse usando un subshell y redirección
( : < dataset.json ) && echo YES
( : >> result.json ) && echo YES
-
Donde se necesita un comando vacío
- Puede usarse cuando la sintaxis requiere un comando, como en
trap, pero en realidad no debe hacerse nada
trap : INT
sleep 60
- También puede colocarse en ramas vacías de un condicional
if some-command; then
:
else
echo "command failed"
fi
-
Comprobar varias variables
- Con
set -u activado, permite comprobar de una sola vez si varias variables están definidas
set -u
: "$DEPLOY_ENV" "$HOST"
-
Bucle infinito
- Como
: siempre tiene éxito, permite escribir de forma concisa un bucle infinito
while :; do
echo "I love colons"
sleep 1
done
1 comentarios
Comentarios en Lobste.rs
: hayalci@tassadar ~/src/dool ; jj rebase -s dxw -d mrnautocddel shell y el siguiente formato~/directoryname; <command>Cada vez que copias una línea de comando del shell, termina haciendo
cdal directorio original donde se ejecutó el comandozsh, lo configura para que al pegar un espacio invisible sin salto de línea borre el contenido de la izquierdamakepuede ejecutar varios procesosechoal mismo tiempo y escribir en el mismo stream, interfiriéndose entre sí. Si se cambia así, es el propio proceso demakeel que imprime y no un proceso hijoman :owhatis :era difícil encontrar documentación útilEs parecido al comando
true, pero se diferencia en que no responde de forma especial a--help,--version, etc., y además tiene menos caractereshelpen vez deman:es literalmente un alias detruePero no se me había ocurrido usarlo para los efectos secundarios que surgen al evaluar los argumentos
:, también se puede poner#para guardarlo como comentario. La ventaja, si es algo que piensas ejecutar después, es que las expresiones dentro no se evalúan por adelantadohttps://nathangrigg.com/2014/04/zsh-push-line-or-edit/
-bash: !}": event not found"!"while true; do...while true; dosolo tiene tres caracteres más quewhile :; do, así que ya es suficientemente corto, y ese código no parece un ejemplo adecuado para el punto que el autor quiere transmitir