He pirateado muchos scripts de shell y, a veces, las cosas más simples me desconciertan. Hoy me encontré con un script que hacía un uso extensivo del :
(dos puntos) bash integrado.
La documentación parece bastante simple:
: (a colon) : [arguments]
No haga nada más que expandir argumentos y realizar redirecciones. El estado de retorno es cero.
Sin embargo, anteriormente solo he visto esto utilizado en demostraciones de expansión de shell. El caso de uso en el script que encontré hizo un uso extensivo de esta estructura:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
En realidad, había cientos de greps, pero son más de lo mismo. No hay redireccionamientos de entrada/salida además de la estructura simple anterior. Ningún valor de retorno se verifica más adelante en el script.
Estoy leyendo esto como una construcción inútil que dice "o no hacer nada". ¿Qué propósito podría servir para terminar estos greps con "o no hacer nada"? ¿En qué caso esta construcción causaría un resultado diferente a simplemente omitir el || :
de todas las instancias?
Respuesta aceptada:
Aparece el :
s en su secuencia de comandos se están utilizando en lugar de true
. Si grep
no encuentra una coincidencia en el archivo, devolverá un código de salida distinto de cero; como jw013 menciona en un comentario, si errexit
está configurado, probablemente por -e
en la línea shebang, el script saldría si alguno de los grep
s no puede encontrar una coincidencia. Claramente, eso no es lo que el autor quería, así que agregó || :
para hacer que el estado de salida de ese comando compuesto en particular sea siempre cero, como el más común (según mi experiencia) || true
/|| /bin/true
.