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 incorporado de shell que es básicamente un NOP , una operación nula que no hace nada excepto devolver true, like true
(y, por lo tanto, establecer $?
a 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 este error es que los argumentos aún se expanden, lo que lleva a una serie de consecuencias no deseadas. Los argumentos todavía se ven afectados por los errores de sintaxis, las redirecciones aún se realizan, por lo que : > file
se truncarán file
y las : $(dangerous command)
sustituciones se seguirán ejecutando.
La forma menos segura y sorprendente de insertar comentarios en los scripts de shell es con #
. Apéguese a eso incluso para comentarios de varias líneas. Nunca intente (ab) usarlo :
para comentarios. No hay un mecanismo de comentarios de varias líneas dedicado en el shell que sea análogo a la forma de barra diagonal /* */
en C
lenguajes similares.
En aras de la exhaustividad, pero no porque sea una práctica recomendada, mencionaré que es posible utilizar documentos aquí 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
CommentedOutBlock() { echo "test"; }