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?
Use : '
para abrir y '
cerrar.
Por ejemplo:
: '
This is a
very neat comment
in bash
'
#
sy nunca esto ...
:
es una forma abreviada de true
y true
no procesa ningún parámetro. (página del manual:SYNOPSIS true [ignored command line arguments]
:
y '
es importante
# '
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.
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
:
no es necesario. Solo comienza con <<
.
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 -e
fuera 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.
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.).
${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.
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.
Usage:
<< EOF ... EOF
¿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
}
}
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
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
'
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.
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
# 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: # $1
o 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):
(^.+)
como expresiones regulares y / #$1
o #\1
como patrones de sustitución# ¡Disfruta tus hashes!
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.
:
esté en la primera columna (sin espacios iniciales) en la línea.