Commenti leggibili su righe separate in un comando bash multilinea con pipeline?


14

Quando si creano script di shell usando pipeline e si usa la barra rovesciata per continuare le righe, voglio inserire commenti su righe separate , in modo robusto, leggibile e portatile.

Ad esempio, dato questo comando multilinea senza commento (rubato da @DigitalRoss per la sua chiarezza):

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

... il seguito è esteticamente più vicino a ciò che voglio realizzare, ma per ovvie ragioni, non funziona ... e sì, sono ben consapevole che questo non è qualcosa che normalmente merita di essere commentato:

# 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

Le risposte correlate esistenti sembrano insoddisfacenti per me , come segue:

Innanzitutto, la risposta di Glenn Jackman (aggiungendo argomenti a un array e quindi eseguendo l'array) funziona per singoli comandi, ma non funziona per il pipelining (e anche se lo facesse, aggiunge complessità che vorrei evitare).

In secondo luogo, anche la risposta di @Gilles qui (che usa :) non sembra funzionare con il pipelining, perché altera il flusso della pipeline:

$ echo "abc" | :
$

( NOTA : se esiste un equivalente :che trasmette un output non modificato, sarebbe esteticamente accettabile, ma non sono stato in grado di trovarne uno. Potrei scriverne uno personalizzato, ma ridurrebbe la portabilità.)

Infine, l'ultima parte della risposta di DigitalRoss su StackOverflow funziona bene per aggiungere commenti sulla stessa riga, ma preferisco fortemente i commenti su righe separate. Altrimenti, quando le linee hanno lunghezze molto variabili, la leggibilità è ridotta:

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

Sto cercando risposte che preservino la leggibilità e minimizzino la complessità, oppure alcuni retroscena del perché ciò che sto cercando non è fattibile.


1
Nota sui tuoi commenti: mi è stato insegnato a scrivere commenti che spiegano una sezione o un'unità di lavoro. Se un programmatore esperto scrive commenti intelligenti che descrivono quello che stanno facendo, presumibilmente chiunque venga a mantenere la sceneggiatura può sempre usare le pagine man se non capisce i dettagli dell'uso. Non si dovrebbe mai scrivere un commento come i++; // increment i by one. Ti suggerisco di leggere "Gli elementi dello stile di programmazione"
bsd

Penso che eliminerò l'ultima modifica. È insolito che una domanda contenga la domanda, le confutazioni delle risposte e la risposta stessa, ma la parte che spiega perché le altre risposte non funzionano è un po 'necessaria qui. La risposta di rozcietrzewiacz e il tuo commento insieme spiegano il problema (personalmente avrei pubblicato una risposta separata e l'avrei accettata, poiché il problema era abbastanza diverso da quello che ha descritto, ma funziona)
Michael Mrozek

Capito - grazie per il feedback; lezione appresa!
Royce Williams,

Risposte:


14

Cosa ne pensi di questo?

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

# Sort the results.
sort | \

# Only show unique lines.
uniq

(La barra rovesciata deve essere utilizzata come ultimo carattere di quelle righe.) Non sono sicuro della portabilità di quell'approccio, ma funziona sicuramente con la corrente bash.


Aha! (facepalm) Ho trasformato il linguaggio che stavo usando quando ho pubblicato la domanda senza accorgermene! Stavo mettendo la pipa all'inizio di ogni riga, che sono felice di smettere di fare ora che so che questo metodo funziona bene su tutti i sistemi che posso raggiungere, sia in bash che in sh. Grazie!
Royce Williams,

Quei commenti non rovinerebbero le continuazioni di linea?
Stuart P. Bentley

Finché c'è una riga vuota prima di ogni commento, funziona benissimo.
Royce Williams,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.