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:
:( 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
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.
¡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 BruceWillis or a relative of MillaJovovich.////
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.
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 eitherfunction giveitadifferentuniquename(){
echo nestable
}}
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.
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
'
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;thenwhile you respect syntax a bit, please
do write here (almost) whatever you want.
but when you are
done# writefi
Una versión un poco sofisticada:
time_of_debug=false # Let's set this variable at the beginning of a scriptif $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: # $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):
Seleccione, copie el texto donde quiera que esté y péguelo en la herramienta de expresiones regulares en línea
Usar (^.+)como expresiones regulares y / #$1o #\1como patrones de sustitución
Seleccione, copie el texto y péguelo donde comenzó
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.
:
esté en la primera columna (sin espacios iniciales) en la línea.Respuestas:
Use
: '
para abrir y'
cerrar.Por ejemplo:
fuente
#
sy nunca esto ...:
es una forma abreviada detrue
ytrue
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
fuente
:
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:
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 noset -e
fuera así) si no fuera por las comillas simples:Por supuesto, podrías usar
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:
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.fuente
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 variableFOO
, 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:
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.fuente
Usage:
<< EOF ... EOF
¿Cuál es tu opinión sobre este?
fuente
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.
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:
fuente
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.fuente
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:
Una versión un poco sofisticada:
fuente
# 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!
fuente
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.