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.
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
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
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.
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.
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"
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.
Respuestas:
En bash:
El delimitador
'
y'
alrededor del mismoEND
son 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.
fuente
EOF
es un ejemplo clásico (y también lo es!
, un signo de exclamación en su propia), pero se puede usarSNURFLE_BURGERS
oclassical_end_marker
o 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.:
) que no lee su entrada y siempre sale con un valor exitoso, y envía el "comentario" como entrada. No mucho.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(que dice, de la línea 10 a la línea de inicio de 100 sustitutos (^) con un signo #).
y un comentario con
(que dice, de la línea 10 a la línea de inicio de sustituto 100 (^) seguido de # con nota //.)
vi
Es casi universal en cualquier lugar donde hay/bin/sh
.fuente
|noh
al final. La tubería separa comandos adicionales y nonoh
sirve 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
<SHIFT>+G 10 <ENTER>
luego0
o por cualquier otra forma de navegar). Luego, use<CTRL>+V
para ingresar al modo de bloqueo visual y resalte el comienzo de todas las líneas que desea comentar (en este ejemplo90 J
). Luego presioneSHIFT+I
para 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.Puedes usar:
fuente
if [ ];
también funciona.if false;
. stackoverflow.com/a/18019516/2097284Lo que sigue debe trabajar para
sh
,bash
,ksh
yzsh
.Los bloques de código a comentar se pueden poner dentro
BEGINCOMMENT
yENDCOMMENT
:La ejecución del código anterior daría como resultado:
Para descomentar los bloques de código así comentados, diga
en vez de
en el ejemplo anterior
fuente
si puedes esquivar las comillas simples:
fuente
Use
: '
para abrir y'
cerrar.Por ejemplo:
Esto es del ejemplo de Vegas encontrado aquí
fuente
En vim:
shift-V
(ingrese al modo visual), arriba abajo líneas resaltadas en bloque:s/^/#/
el comando se verá así:
Pulsa Enter
p.ej
fuente
:s/^#/
Puede usar el modo Visual Block de Vi / Vim, que está diseñado para cosas como esta:
El comentario sería:
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).
fuente
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.
fuente
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'
.(Se encuentra en " Incrustar documentación en el script de shell ")
fuente
Otro modo es: si su editor NO TIENE opción de comentario BLOQUE,
HECHO
Funciona con cualquier editor
fuente
Me gusta una sola línea abierta y cerrada:
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.
fuente