bash – Comentarios de secuencias de comandos de shell multilínea: ¿cómo funciona?

Pregunta:

Recientemente, me encontré con un tipo de comentario de varias líneas que nunca había visto antes; aquí hay un ejemplo de secuencia de comandos:

echo a
#
: aaa 
: ddd 
#
echo b

Esto parece funcionar, incluso la sintaxis de vim resalta. ¿Cómo se llama este estilo de comentarios y cómo puedo encontrar más información al respecto?

Respuesta:

Ese no es un comentario de varias líneas. # es un comentario de una sola línea. : (dos puntos) no es un comentario en absoluto, sino más bien un comando integrado de shell que es básicamente un NOP , una operación nula que no hace nada más que devolver verdadero, como true (y por lo tanto establecer $? en 0 como efecto secundario) . Sin embargo, dado que es un comando, puede aceptar argumentos y, dado que ignora sus argumentos, en la mayoría de los casos actúa superficialmente como un comentario. El principal problema con esta torpeza es que los argumentos aún se amplían, lo que lleva a una serie de consecuencias no deseadas. Los argumentos aún se ven afectados por errores de sintaxis, las redirecciones aún se realizan, por lo que : > file truncará el file y : $(dangerous command) sustituciones de : $(dangerous command) aún se ejecutarán.

La forma menos sorprendente y completamente segura de insertar comentarios en scripts de shell es con # . Cíñete a eso incluso para comentarios de varias líneas. Nunca intente (ab) usar : para comentarios. No hay un mecanismo de comentarios de varias líneas dedicado en el shell que sea análogo a la forma slash-star /* */ en C similares a C


En aras de la exhaustividad, pero no porque sea una práctica recomendada, mencionaré que es posible utilizar aquí-documentos para hacer "comentarios" de varias líneas:

: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment".  According to the POSIX spec linked 
above, if any character in the delimiter word ("end_long_comment" in 
this case) above is quoted, the here-document will not be expanded in 
any way.  This is **critical**, as failing to quote the "end_long_comment" 
will result in the problems with unintended expansions described above. 
All of this text in this here-doc goes to the standard input of :, which 
does nothing with it, hence the effect is like a comment.  There is very 
little point to doing this besides throwing people off.  Just use '#'.
end_long_comment

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım