¿Forma de crear comentarios multilínea en Bash?

226

Recientemente comencé a estudiar el script de shell y me gustaría poder comentar un conjunto de líneas en un script de shell. Quiero decir que es en el caso de C / Java:

/* comment1
   comment2 
   comment3
*/`

¿Cómo podría hacer eso?

Enes Malik Turhan
fuente
2
Puede usar hash como: #esto es un comentario.
Mohammad Tayyab
1
Lo sé, pero es un poco problemático para multilínea.
Enes Malik Turhan
2
Cabe señalar que las respuestas a continuación requieren que :esté en la primera columna (sin espacios iniciales) en la línea.
ty

Respuestas:

394

Use : 'para abrir y 'cerrar.

Por ejemplo:

: '
This is a
very neat comment
in bash
'
Vegas
fuente
27
:( y también agrega una gran cantidad de capacidad de no lectura y potencial fuente de errores. En mi humilde opinión, es mejor usar múltiples #sy nunca esto ...
jm666
51
@ jm666 En mi humilde opinión Nunca es una buena idea usar la palabra nunca cuando no tienes idea de todos los casos de uso.
Invierno
19
para explicar: :es una forma abreviada de truey trueno procesa ningún parámetro. (página del manual:SYNOPSIS true [ignored command line arguments]
phil294
46
El espacio entre :y 'es importante
becko
23
Modifiqué esto ligeramente para bloques de código para poder activar o desactivar fácilmente el código. Mi cambio es usar # 'en la última línea en lugar de la comilla simple. De esta manera puedo poner un sencillo #en la primera línea para activar el bloque de código. Elimine el #en la primera línea para desactivar el código.
JohnMudd
131

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
fuente
44
Esto funciona, la respuesta actualmente aceptada no (para mí).
Freek
55
Probablemente valga la pena señalar que este no es un comentario per se. Este es un heredoc que se redirige al comando NOP como una cadena de varias líneas. La comilla simple es importante para deshabilitar la resolución de variables y comandos.
Nux
1
@Freek necesita agregar espacio
mazs
Probé esto en un script bash simple que se ejecuta a través de su línea shebang, #! / Bin / bash en Debian y falló. Estoy probando cada respuesta en esta página, y todas han fallado hasta que llegué a la siguiente. Como fallaron, les estoy bajando el voto y votando al que realmente funciona correctamente.
PyTis
1
Buenas pruebas en tu ejemplo. El liderazgo :no es necesario. Solo comienza con <<.
wisbucky
34

Estoy actualizando esta publicación en función de los comentarios y otras respuestas, por lo que los comentarios anteriores al 22 de mayo de 2020 ya no se aplicarán.

Bash no proporciona una sintaxis integrada para comentarios de varias líneas, pero hay hacks que usan 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 citado, pero haz que sea obvio 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

Las comillas simples del marcador HEREDOC evitan algunos efectos secundarios del análisis de shell, como las subvenciones extrañas que causarían un bloqueo o salida, e incluso el análisis del marcador en sí. Por lo tanto, las comillas simples le dan más libertad en el marcador de comentario de abrir-cerrar. Por ejemplo, a continuación se utiliza un hash triple que sugiere comentarios de varias líneas en bash. Esto bloquearía el script si las comillas simples estuvieran ausentes. Incluso si lo elimina ###, FOO{}se bloquearía el script (o causaría una mala sustitución si no set -efuera así) 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.

Hoy en día, cualquier buen editor le permite presionar ctrl- o similar, para des / comentar la selección. Todos definitivamente entienden esto:

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

aunque es cierto, esto no es tan conveniente como el comentario del bloque anterior si desea volver a llenar sus párrafos.

Seguramente hay otras técnicas, pero no parece haber una forma "convencional" de hacerlo. Sería bueno si ###>y ###<podrían añadirse a bash para indicar comienzo y al final del bloque de comentarios, parece que podría ser bastante sencillo.

Oliver
fuente
1
¡Ah, este es fácil / lo suficientemente limpio como para recordarlo!
Thamme Gowda
1
Como se observa en la respuesta anterior, además de las comillas inversas, la secuencia $ (...) también se expandirá ya que ambas formas son sustitución de comandos.
Perl Ancar
"Ambos son hacks para que puedan romper los guiones en el futuro". ¿Podrías ampliar esto? Aunque piratea semánticamente, sintácticamente son válidos y no deberían romperse en el futuro, a menos que bash decida volverse loco y rompa los heredocs.
Perl Ancar
@perlancar Si estamos de acuerdo en que los hacks son soluciones que usan una función de idioma / lib que no tiene ninguna relación con el problema (como usar un heredoc para un comentario, o usar un parámetro en un comando de no hacer nada como true), incluso si no lo hacen No se arriesgue a romper (el enfoque heredoc no lo hace, pero la versión de dos puntos sí), 1) los piratas informáticos aún ofuscan la intención: sin la primera línea insinuando comentarios multilínea, la mayoría se rascaría la cabeza preguntándose qué está haciendo ese código; y 2) tienen esquinas oscuras inesperadas (como tener que duplicar una cita, citar el marcador heredoc en ciertos casos, etc.).
Oliver
@Oliver: si no se cita, las variables pueden tener efectos secundarios desagradables. Imagina que has incrustado en tu heredoc -comenta una cadena como ${FOO:=bar}o ${FOO{}}. El primero puede tener el efecto secundario de crear y establecer la variable FOO, el segundo generará un error de sustitución incorrecto; ambos efectos que no esperarías de un comentario real.
user1934428
24

Después de leer las otras respuestas aquí, se me ocurrió lo siguiente, que en mi humilde opinión deja en claro que es un comentario. Especialmente adecuado para la 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 las barras se usan normalmente para comentarios de línea).

Por supuesto, "////"es solo una cadena; El número de barras en el prefijo y el sufijo debe ser igual.

noamtm
fuente
3
Casi me perdí elUsage:
ARN
Gran adición a la respuesta anterior. Honestamente, creo que podría haber editado la respuesta anterior y agregarla, en lugar de responder por separado.
PyTis
Hay algunas respuestas "anteriores" (dependiendo de su orden de clasificación). Y, respondiendo por separado, quería explicar la razón detrás de la cadena que elegí.
noamtm
<< EOF ... EOF
l mingzhi
5

¿Cuál es tu opinión sobre este?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}
Imre
fuente
hola, no fue pensado como una pregunta, en lugar de una respuesta a la pregunta original
Imre
No es bueno OMI. Requiere que el comentario sea ​​analizable como código shell, lo cual es bastante restrictivo.
user1934428
3

Así es como hago comentarios multilínea en bash.

Este mecanismo tiene dos ventajas que aprecio. Una es que los comentarios pueden estar anidados. La otra es que los bloques se pueden habilitar simplemente comentando la línea de inicio.

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

En el ejemplo anterior, el bloque "B" está comentado, pero las partes del bloque "A" que no son el bloque "B" no están comentadas.

Ejecutar ese ejemplo producirá esta salida:

foo {
./example: line 5: fn: command not found
foo }
can't happen
bugi
fuente
3

Intenté la respuesta elegida, pero descubrí que cuando ejecutaba un script de shell que lo 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: miedo . Luego me di cuenta mientras lo editaba que las comillas simples pueden abarcar varias líneas. Entonces ... simplemente 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
fuente
Simplemente no es necesario asignarlo a una variable, que es un efecto secundario que no esperaríamos de un 'comentario'. Reemplace el x=by a : y tendrá el mismo efecto sin efectos secundarios. El único inconveniente es que el comentario no debe contener una sola cita. Es por eso que prefiero el uso de un heredoc citado: con esto, el comentarista puede elegir una cadena de terminación adecuada a su gusto.
user1934428
2

Solución simple, no muy inteligente:

Bloquee temporalmente una parte de un script:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

Una versión un poco sofisticada:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi
xerostomus
fuente
-2

# Me gusta la pereza y la simplicidad. Usaría # con una solución alternativa divertida:

1 PRESIONE:] buscar ctrl + F o cmd + F o lo que sea [para activar la funcionalidad de búsqueda

2 usa una expresión regular en el campo de búsqueda como: (^.+)

3 reemplace con: # $1o si lo prefiere#$1


# Nota: es posible que no tenga los tres pasos en su editor. En ese caso, use una herramienta de expresiones regulares en línea (no puedo sugerir una aquí por razones de política):

  1. Seleccione, copie el texto donde quiera que esté y péguelo en la herramienta de expresiones regulares en línea
  2. Usar (^.+)como expresiones regulares y / #$1o #\1como patrones de sustitución
  3. Seleccione, copie el texto y péguelo donde comenzó

# ¡Disfruta tus hashes!

AMDP
fuente
En la actualidad, muchos editores tienen la tecla de acceso rápido ctrl+/que activa o desactiva los comentarios, incluso para varias líneas. También puede cambiar el carácter del comentario según el idioma que esté utilizando.
ninMonkey