Bloquear comentarios en un script de Shell

250

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

ellos conmemoran
fuente
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.

soleado256
fuente
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.

OscarRyz
fuente
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
dannyhan12
fuente
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

devnull
fuente
23

si puedes esquivar las comillas simples:

__='
blah blah comment.
'
vanvliet.eric
fuente
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_
15

Use : 'para abrir y 'cerrar.

Por ejemplo:

: '
This is a
very neat comment
in bash
'

Esto es del ejemplo de Vegas encontrado aquí

Relativo0
fuente
2
hack-ish, pero increíble
Gergely Lukacsy
Es el mejor para mí.
DPalharini
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>
stefanB
fuente
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).

Horta
fuente
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.

Oxidado75
fuente
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 ")

mivk
fuente
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

mardocheo
fuente
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.

Ynnub
fuente