Bloquear comentarios en un script de Shell


250

¿Hay una manera simple de comentar un bloque de código en un script de shell?


2
Interesante cómo una pregunta tan simple y simple tiene respuestas demasiado diferentes y complicadas.
Sigur

Respuestas:


348

En bash:

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment

El delimitador 'y 'alrededor del mismo ENDson importantes, de lo contrario, las cosas dentro del bloque, como por ejemplo $(command), se analizarán y ejecutarán.

Para una explicación, vea esta y esta pregunta.


24
Lindo truco: siempre que la palabra clave 'FIN' (que, por supuesto, sea elegida por el usuario) no aparezca en una línea por sí sola dentro del material que se va a comentar.
Jonathan Leffler

99
@kalengi: sí; la palabra usada en las comillas puede ser conveniente; EOFes un ejemplo clásico (y también lo es !, un signo de exclamación en su propia), pero se puede usar SNURFLE_BURGERSo classical_end_markero cualquier otra palabra que no aparece en una línea por sí sola en el material comentado de salida. Me cansaría de experimentar con espacios, etc., pero la palabra también podría funcionar con ellos.
Jonathan Leffler

44
Definitivamente funciona, pero ¿alguien puede explicar cómo funciona esto? Gracias
mbbce

55
@MB_CE, consulte stackoverflow.com/questions/32126653/… . Dicho esto, está ejecutando un comando ( :) que no lee su entrada y siempre sale con un valor exitoso, y envía el "comentario" como entrada. No mucho.
Charles Duffy

2
Considero que es increíblemente feo y confuso escribir código activo para crear código pasivo ... solo use el modo de selección de bloque antiguo y presione #; ¿Cuál es el gran problema con eso?
Rusty75

90

No hay comentarios de bloque en el script de shell.

Utilizando vi(sí, vi) se puede comentar con facilidad desde la línea n a m

<ESC>
:10,100s/^/#/

(que dice, de la línea 10 a la línea de inicio de 100 sustitutos (^) con un signo #).

y un comentario con

<ESC>
:10,100s/^#//

(que dice, de la línea 10 a la línea de inicio de sustituto 100 (^) seguido de # con nota //.)

viEs casi universal en cualquier lugar donde hay /bin/sh.


Buen truco con expresión regular en vi para colocar # delante de las líneas.
Atiq Rahman

55
Solo un consejo: si está usando vim y esto termina resaltando el comienzo de cada línea, agregue |nohal final. La tubería separa comandos adicionales y no nohsirve para nada. El resaltado de términos de búsqueda se reanudará automáticamente la próxima vez que busque algo. Ejemplo::10,100s/^/#/g|noh
Mateo

Necesito que esto se automatice desde un script. ¿Hay alguna manera de hacer eso a un archivo con vi sin necesidad de interacción humana?
Timothy Swan

1
@TimothySwan Me imagino que el programa gawk o sed podría hacer eso ... de alguna manera.
BeowulfNode42

mi forma preferida de comentar (o prefijar) un bloque con vi: vaya al comienzo de la línea en la que desea comenzar a comentar (por ejemplo, <SHIFT>+G 10 <ENTER>luego 0o por cualquier otra forma de navegar). Luego, use <CTRL>+Vpara ingresar al modo de bloqueo visual y resalte el comienzo de todas las líneas que desea comentar (en este ejemplo 90 J). Luego presione SHIFT+Ipara insertar antes del bloque resaltado. Ingrese el signo de comentario (por ejemplo #) y presione <ESC>para finalizar su prefijo. Esta explicación suena muy larga, pero en mi experiencia es mucho más rápida en la práctica.
Ueffes

52

Puedes usar:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi

14
Esto es clásico, pero como señala stackoverflow.com/a/19409316/832230 , if [ ];también funciona.
Acumenus

12
Tal vez más claro: if false;. stackoverflow.com/a/18019516/2097284
Camille Goudeseune

3
Esto solo parece funcionar solo si el texto comentado es en realidad código. Me encuentro con problemas con los comentarios con tuberías y punto y coma. La respuesta de Sunny256 funcionó.
swdev

aún más conciso sería []; usando la prueba que es
Justin Duncan

27

Lo que sigue debe trabajar para sh, bash, kshy zsh.

Los bloques de código a comentar se pueden poner dentro BEGINCOMMENTy ENDCOMMENT:

[ -z $BASH ] || shopt -s expand_aliases
alias BEGINCOMMENT="if [ ]; then"
alias ENDCOMMENT="fi"

BEGINCOMMENT
  echo "This line appears in a commented block"
  echo "And this one too!"
ENDCOMMENT

echo "This is outside the commented block"

La ejecución del código anterior daría como resultado:

This is outside the commented block

Para descomentar los bloques de código así comentados, diga

alias BEGINCOMMENT="if : ; then"

en vez de

alias BEGINCOMMENT="if [ ]; then"

en el ejemplo anterior


23

si puedes esquivar las comillas simples:

__='
blah blah comment.
'

Me gusta esto. ¿Pero qué significa el doble guión bajo? ¿Lo mejor que puedo decir es que es solo un nombre de variable usando la convención de que debería tratarse como privado?
chessofnerd

También proporciona resaltado de sintaxis en la mayoría de los editores y se puede llamar si es necesario con $ __, aunque sugeriría un nombre variable como documentación o documentos para mayor claridad.
jasonleonhard

También puede agregar la palabra local en frente de referencia aquí
jasonleonhard

Esta debería ser la mejor respuesta. Simplemente coloque un nombre de variable ficticio en lugar de los guiones bajos dobles
B Abali

Intenté esto, pero fallé porque había un -F ';' dentro del bloque para comentar.
yO_


14

En vim:

  1. vaya a la primera línea del bloque que desea comentar
  2. shift-V (ingrese al modo visual), arriba abajo líneas resaltadas en bloque
  3. ejecutar lo siguiente en la selección :s/^/#/
  4. el comando se verá así:

      :'<,'>s/^/#
  5. Pulsa Enter

p.ej

shift-V
jjj
:s/^/#
<enter>

77
Para descomentar el uso:s/^#/
Buge

Compruebe la respuesta de @ horta: stackoverflow.com/a/28376319/3506015 : ¡hay incluso menos pulsaciones de teclas!
geedoubleya

4

Puede usar el modo Visual Block de Vi / Vim, que está diseñado para cosas como esta:

Ctrl-V  
Highlight first element in rows you want commented  
Shift-i  
#  
esc  

El comentario sería:

Ctrl-V  
Highlight #'s  
d  
l  

Esta es la forma interactiva de vi de hacer este tipo de cosas en lugar de contar o leer números de línea.

Por último, en Gvim usa ctrl-q para ingresar al modo Bloque visual en lugar de ctrl-v (porque ese es el atajo para pegar).


Me encanta este método simplista. : o)
geedoubleya

4

Con toda honestidad, ¿por qué tanta ingeniería excesiva ...

Considero realmente una mala práctica escribir código activo para generar código pasivo.

Mi solución: la mayoría de los editores tienen modo de selección de bloque. Solo úselo para agregar # a todas las líneas que desea comentar. Cual es el problema...

Ejemplo de bloc de notas:

Para crear: Alt - arrastre con el mouse hacia abajo, presione #.

Para eliminar: Alt-ratón arrastrado hacia abajo, desplazamiento-flecha derecha, eliminar.


8
Lo más probable es que el usuario esté en la terminal. No se puede asumir un entorno de mouse.
Gary

¿Todavía existen? Usualmente edito en modo gráfico y pego de nuevo usando vi, esa sería una solución fácil.
Rusty75

2

Una variación del truco here-doc en la respuesta aceptada por sunny256 es usar las palabras clave de Perl para comentarios. Si sus comentarios son en realidad algún tipo de documentación, puede comenzar a usar la sintaxis de Perl dentro del bloque comentado, que le permite imprimirlo con un formato agradable, convertirlo en una página de manual, etc.

En lo que respecta al shell, solo necesita reemplazarlo 'END'con '=cut'.

echo "before comment"
: <<'=cut'
=pod

=head1 NAME
   podtest.sh - Example shell script with embedded POD documentation

etc.

=cut
echo "after comment"

(Se encuentra en " Incrustar documentación en el script de shell ")


0

Otro modo es: si su editor NO TIENE opción de comentario BLOQUE,

  1. Abra una segunda instancia del editor (por ejemplo, Archivo => Nuevo archivo ...)
  2. Desde el archivo anterior en el que está trabajando, seleccione SOLO LA PARTE QUE DESEA COMENTAR
  3. Cópielo y péguelo en la ventana del nuevo archivo temporal ...
  4. Abra el menú Editar, seleccione REEMPLAZAR e ingrese como cadena para ser reemplazado '\ n'
  5. entrada como reemplazar cadena: '\ n #'
  6. presione el botón 'reemplazar TODO'

HECHO

Funciona con cualquier editor


0

Me gusta una sola línea abierta y cerrada:

if [ ]; then ##
    ...
    ...
fi; ##

El '##' me ayuda a encontrar fácilmente el inicio y el final del comentario de bloque. Puedo pegar un número después del '##' si tengo muchos. Para desactivar el comentario, solo pongo un '1' en el '[]'. También evito algunos problemas que he tenido con comillas simples en el bloque comentado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.