Comentarios en línea para Bash?


142

Me gustaría poder comentar una sola bandera en un comando de una línea. Bash solo parece tener from # till end-of-linecomentarios. Estoy mirando trucos como:

ls -l $([ ] && -F is turned off) -a /etc

Es feo, pero mejor que nada. ¿Hay una mejor manera?

Lo siguiente parece funcionar, pero no estoy seguro de si es portátil:

ls -l `# -F is turned off` -a /etc

El #commenttruco también se menciona aquí: stackoverflow.com/questions/9522631/…
Juha Palomäki

1
Siguiendo el enlace mencionado por @Juha Palomäki, existe este maravilloso truco ${IFS#comment}introducido por @pjh en los comentarios. No se invoca ningún sub-shell.
alexis

Respuestas:


110

Mi preferido es:

Comentando en un script Bash

Esto tendrá algunos gastos generales, pero técnicamente responde a su pregunta

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

Y para tuberías específicamente, hay una solución más limpia sin gastos generales

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

Cómo poner un comentario de línea para un comando de varias líneas


3
Tenga en cuenta que tiene que usar backticks, $(#comment)no funciona.
funroll

1
Algunas versiones considerarán el )como parte del comentario en sí. La mayoría de los desafíos de bash se deben a la compatibilidad retro con versiones anteriores, y una estrategia común es utilizar la solución más antigua posible.
Rafareino

2
Tenga en cuenta que este no es un comentario real: true && `# comment` && truees una expresión válida. Un comentario real generaría algo como: syntax error near unexpected token && ''
Sebastian Wagner el

Tienes razón @sebastianwagner, ten en cuenta también que fallaría en un cortocircuito OR o algo así, pero creo que es lo mejor que podemos conseguir sin complicar mucho las cosas. Para mí, es una señal de que uno necesita un mejor lenguaje, pero puede hacerlo muy bien, manteniendo el código ya construido con tales 'comentarios' para documentarlo.
Rafareino

¡Gracias que me ayudaron!
xiarnousx

58

Me resulta más fácil (y más legible) simplemente copiar la línea y comentar la versión original:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

Votación a favor de la claridad. No sé por qué esta no es la primera opción.
David Tabernero M.

pero entonces no está en línea? Supongo que es justo decir que la necesidad de hacer cosas que no están respaldadas por bash es motivo para encontrar otra manera
ThorSummoner

25

$(: ...) es un poco menos feo, pero aún no es bueno.


2
Con esta sintaxis, está activando un sub-shell, se supone que un comentario mejorará la redacción sin cambiar el comportamiento del código, pero el tiempo para lauch / end de este sub shell hará que su código sea más lento (por decir lo menos), ¿Por qué no usar solo los dos puntos al comienzo de una nueva línea?
Rafareino

1
Con $ {IFS # ...} no se invoca ningún sub-shell.
alexis

3
@Rafareino: sí. Pero en serio, en el 95% de las aplicaciones esta sobrecarga no importará en absoluto. Para muchos de los casos en los que sí importa, probablemente hubiera sido una buena idea utilizar un lenguaje más rápido que Bash en primer lugar.
Leftaroundabout

... el problema es que la $(: ...)sintaxis en realidad no parece permitir incrustar comentarios: mientras echo "foo" `# comment` "bar"que terminará el comentario en el segundo backtick, el supuesto equivalente echo "foo" $(: # comment) "bar"no analiza nada detrás del #.
Leftaroundabout


4

Aquí está mi solución para comentarios en línea entre múltiples comandos canalizados.

Ejemplo de código no comentado:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

Solución para un comentario de tubería (usando una función auxiliar):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

O si lo prefiere, esta es la misma solución sin la función auxiliar, pero es un poco más complicada:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

77
Por otro lado, si mueve el carácter de la tubería al final de la línea anterior, puede deshacerse de las asquerosas líneas diagonales de barra invertida.
tripleee

3

La mayoría de los comandos permiten que los args lleguen en cualquier orden. Simplemente mueva las banderas comentadas al final de la línea:

ls -l -a /etc # -F is turned off

Luego, para volver a encenderlo, simplemente descomenta y elimina el texto:

ls -l -a /etc -F

1
maldición, agregué #sin un solo espacio en blanco después del comando. ¡gracias!
pide el


1

Para deshabilitar una parte de un comando como a && b, simplemente creé un script vacío xque está en camino, para que pueda hacer cosas como:

mvn install && runProject

cuando necesito construir, y

x mvn install && runProject

cuando no (usando Ctrl + Ay Ctrl + Epara moverse al principio y al final).

Como se señaló en los comentarios, otra forma de hacerlo es Bash integrado en :lugar de x:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
Tal construcción ya existe: :Como en:string; of; commands; : disabled; enabled;
xenithorb

Aún mejor :) Gracias
Ondra Žižka

-1

Si vale la pena hacer el comentario, probablemente pueda ir al final de la línea o en una línea por sí solo. Raramente encuentro la necesidad de comentarios dentro de la línea con código antes y después del comentario en cualquier idioma.

Oh, hay una excepción, que es el dialecto de SQL que suelo usar y que usa '{comentarios}'. De vez en cuando escribiré:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

Pero incluso eso es una exageración.

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.