¿Manera de crear comentarios multilínea en Bash?

Resuelto Enes Malik Turhan asked hace 7 años • 12 respuestas

Recientemente comencé a estudiar el script de Shell y me gustaría poder comentar un conjunto de líneas en un script de Shell. Me refiero a como es en el caso de C/Java:

/* comment1
   comment2 
   comment3
*/

¿Cómo podría hacer eso?

Enes Malik Turhan avatar Apr 01 '17 21:04 Enes Malik Turhan
Aceptado

Se utiliza : 'para abrir y 'cerrar.

Por ejemplo:

: '
This is a
very neat comment
in bash
'
Vegas avatar Apr 01 '2017 14:04 Vegas

Comentario multilínea en bash

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT
David Okwii avatar Sep 05 '2017 07:09 David Okwii

Nota: Actualicé esta respuesta en función de los comentarios y otras respuestas, por lo que es posible que los comentarios anteriores al 22 de mayo de 2020 ya no se apliquen. También noté hoy que algunos IDE como VS Code y PyCharm no reconocen un marcador HEREDOC que contiene espacios, mientras que bash no tiene problemas con él, así que estoy actualizando esta respuesta nuevamente.

Bash no proporciona una sintaxis incorporada para comentarios de varias líneas, pero existen trucos que utilizan la sintaxis de bash existente que "funcionan ahora".

Personalmente, creo que lo más simple (es decir, menos ruidoso, menos extraño, más fácil de escribir, más explícito) es usar un HEREDOC entre comillas, pero deja claro lo que estás haciendo y usa el mismo marcador HEREDOC en todas partes:

<<'###BLOCK-COMMENT'
line 1
line 2

line 3
line 4
###BLOCK-COMMENT

El uso de comillas simples en el marcador HEREDOC evita algunos efectos secundarios del análisis del shell, como sustituciones extrañas que provocarían fallos o resultados, e incluso el análisis del propio marcador. Entonces, las comillas simples te dan más libertad en el marcador de comentarios de apertura y cierre.

Por ejemplo, lo siguiente utiliza un hash triple que sugiere un comentario de varias líneas en bash. Esto bloquearía el script si no estuvieran las comillas simples. Incluso si elimina ###, FOO{}el script bloquearía (o provocaría que se imprimiera una sustitución incorrecta si no set -e) si no fuera por las comillas simples:

set -e

<<'###BLOCK-COMMENT'
something something ${FOO{}} something
more comment
###BLOCK-COMMENT

ls

Por supuesto, podrías usar

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

pero la intención de esto es definitivamente menos clara para un lector que no esté familiarizado con este truco.

Tenga en cuenta que mi respuesta original usaba '### BLOCK COMMENT', lo cual está bien si usa vanilla vi/vim, pero hoy noté que PyCharm y VS Code no reconocen el marcador de cierre si tiene espacios.

Hoy en día, cualquier buen editor te permite presionar ctrl-/ o similar, para descomentar la selección. Definitivamente todos entienden esto:

# something something ${FOO{}} something
# more comment
# yet another line of comment

aunque es cierto que esto no es tan conveniente como el comentario en bloque anterior si desea volver a completar sus párrafos.

Seguramente existen otras técnicas, pero no parece haber una forma "convencional" de hacerlo. Sería bueno si ###>se ###<pudiera agregar y a bash para indicar el inicio y el final del bloque de comentarios, parece que podría ser bastante sencillo.

Oliver avatar Apr 12 '2018 21:04 Oliver

Después de leer las otras respuestas aquí, se me ocurrió lo siguiente, que en mi humilde opinión deja muy claro que es un comentario. Especialmente adecuado para información de uso en script:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

Como programador, la secuencia de barras se registra inmediatamente en mi cerebro como un comentario (aunque normalmente se utilizan barras para comentarios de línea).

Por supuesto, "////"es sólo una cuerda; el número de barras en el prefijo y el sufijo deben ser iguales.

noamtm avatar Jul 19 '2018 12:07 noamtm

Probé la respuesta elegida, pero descubrí que cuando ejecuté un script de Shell que la tenía, todo se imprimía en la pantalla (similar a cómo los cuadernos Jupyter imprimen todo entre '''xx'''comillas) y había un mensaje de error al final. No estaba haciendo nada, pero: aterrador . Luego, mientras lo editaba, me di cuenta de que las comillas simples pueden abarcar varias líneas. Entonces... asignemos el bloque a una variable.

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'
Nikhil VJ avatar Oct 08 '2019 18:10 Nikhil VJ