¿Comentarios legibles en líneas separadas en un comando bash de varias líneas con tuberías?

14

Al crear scripts de shell utilizando tuberías y utilizando la barra diagonal inversa para continuar líneas, quiero insertar comentarios en líneas separadas , de una manera robusta, legible y portátil.

Por ejemplo, dado este comando de varias líneas no comentado (robado de @DigitalRoss por su claridad):

echo abc |
     tr a-z A-Z |
     sort |
     uniq

... el siguiente es estéticamente más cercano a lo que quiero lograr, pero por razones obvias, no funciona ... y sí, soy muy consciente de que esto no es algo que normalmente valga la pena comentar:

# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
    # Convert lowercase to uppercase.
     tr a-z A-Z |

     # Sort the results.
     sort |

     # Only show unique lines.
     uniq

Las respuestas relacionadas existentes me parecen insatisfactorias , de la siguiente manera:

Primero, la respuesta de Glenn Jackman (agregar argumentos a una matriz y luego ejecutar la matriz) funciona para comandos individuales, pero no funciona para la canalización (e incluso si lo hiciera, agrega complejidad que me gustaría evitar).

En segundo lugar, la respuesta de @Gilles aquí (que usa :) tampoco parece funcionar con la canalización, porque altera el flujo de la tubería:

$ echo "abc" | :
$

( NOTA : Si hay un equivalente a :esa salida que no se modifica, eso sería estéticamente aceptable, pero no he podido encontrar uno. Podría escribir uno personalizado, pero reduciría la portabilidad).

Finalmente, la última parte de la respuesta de DigitalRoss en StackOverflow funciona bien para agregar comentarios en la misma línea, pero prefiero los comentarios en líneas separadas. De lo contrario, cuando las líneas tienen longitudes muy diferentes, se reduce la legibilidad:

echo abc |         # normal comment OK here`
     /usr/local/bin/really/long/path/ridiculously-long-filename.sh |  # another normal comment OK here
     sort |        # the pipelines are automatically continued
     uniq          # final comment

Estoy buscando respuestas que preserven la legibilidad y minimicen la complejidad, o bien algunos antecedentes sobre por qué lo que estoy buscando es inviable.

Royce Williams
fuente
1
Nota sobre sus comentarios: me enseñaron a escribir comentarios explicando una sección o unidad de trabajo. Si un codificador experimentado escribe comentarios inteligentes que describen lo que está haciendo, entonces, presumiblemente, cualquier persona que venga manteniendo el script siempre puede usar páginas de manual si no comprende los detalles de uso. Uno nunca debería escribir un comentario como i++; // increment i by one. Le sugiero que lea "Los elementos del estilo de programación"
bsd
Creo que voy a eliminar la última edición. Es inusual que una pregunta contenga la pregunta, las refutaciones de las respuestas y la respuesta en sí, pero aquí es necesaria la parte que explica por qué otras respuestas no funcionan. Sin embargo, la respuesta de rozcietrzewiacz y su comentario juntos explican el problema (personalmente habría publicado una respuesta por separado y la acepté, ya que el problema era bastante diferente de lo que describió, pero esto funciona)
Michael Mrozek
Entendido: gracias por los comentarios; ¡lección aprendida!
Royce Williams

Respuestas:

14

¿Qué tal esto?

echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \

# Sort the results.
sort | \

# Only show unique lines.
uniq

(La barra invertida debe usarse como el último carácter en esas líneas). No estoy seguro acerca de la portabilidad de ese enfoque, pero sí funciona con la corriente bash.

rozcietrzewiacz
fuente
¡Ajá! (facepalm) ¡Transformé el idioma que estaba usando cuando publiqué la pregunta sin darme cuenta! Estaba colocando la tubería al comienzo de cada línea, lo cual me alegra dejar de hacer ahora que sé que este método funciona bien en todos los sistemas que puedo alcanzar, tanto en bash como en sh. ¡Gracias!
Royce Williams
¿No arruinarían esos comentarios las continuas líneas?
Stuart P. Bentley
Siempre que haya una línea vacía antes de cada comentario, funciona bien.
Royce Williams