Lesbare Kommentare in separaten Zeilen in einem mehrzeiligen Bash-Befehl mit Pipelines?

14

Beim Erstellen von Shell-Skripten mithilfe von Pipelines und unter Verwendung des Backslashs zum Fortsetzen von Zeilen möchte ich Kommentare in robuster, lesbarer und portabler Weise in separate Zeilen einfügen .

Beispiel für diesen nicht kommentierten mehrzeiligen Befehl (der aus Gründen der Übersichtlichkeit von @DigitalRoss gestohlen wurde):

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

... das Folgende kommt dem, was ich erreichen möchte, ästhetisch am nächsten, funktioniert aber aus offensichtlichen Gründen nicht ... und ja, mir ist klar, dass dies normalerweise keine Anmerkung wert ist:

# 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

Bestehende verwandte Antworten erscheinen mir wie folgt unbefriedigend :

Erstens funktioniert die Antwort von Glenn Jackman (Hinzufügen von Argumenten zu einem Array und anschließendes Ausführen des Arrays) für einzelne Befehle, funktioniert jedoch nicht für Pipelining (und selbst wenn dies der Fall ist , erhöht sie die Komplexität, die ich vermeiden möchte).

Zweitens scheint die Antwort von @Gilles hier (die verwendet :) auch nicht mit Pipelining zu funktionieren, da sie den Fluss der Pipeline verändert:

$ echo "abc" | :
$

( ANMERKUNG : Wenn es ein Äquivalent gibt, :das die Ausgabe unverändert weitergibt, wäre dies ästhetisch akzeptabel, aber ich konnte keines finden. Ich könnte ein benutzerdefiniertes schreiben, aber es würde die Portabilität verringern.)

Schließlich eignet sich der letzte Teil von DigitalRoss 'Antwort auf StackOverflow gut zum Hinzufügen von Kommentaren in derselben Zeile, aber ich bevorzuge nachdrücklich Kommentare in separaten Zeilen. Andernfalls wird die Lesbarkeit verringert, wenn die Zeilen sehr unterschiedlich lang sind:

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

Ich suche nach Antworten, die die Lesbarkeit bewahren und die Komplexität minimieren, oder nach Hintergrundinformationen, warum das, wonach ich suche, nicht machbar ist.

Royce Williams
quelle
1
Anmerkung zu Ihren Kommentaren: Es wurde mir beigebracht, Kommentare zu einem Abschnitt oder einer Arbeitseinheit zu verfassen. Wenn ein erfahrener Programmierer intelligente Kommentare schreibt, die beschreiben, was er tut, kann vermutlich jeder, der das Skript wartet, Manpages verwenden, wenn er die Einzelheiten der Verwendung nicht versteht. Man sollte niemals einen Kommentar schreiben wie i++; // increment i by one. Ich schlage vor, Sie lesen "Die Elemente des Programmierstils"
bsd
Ich denke, ich werde die letzte Änderung löschen. Es ist ungewöhnlich, dass eine Frage die Frage, Widerlegungen von Antworten und die Antwort selbst enthält, aber der Teil, der erklärt, warum andere Antworten nicht funktionieren, ist hier irgendwie notwendig. Die Antwort von rozcietrzewiacz und Ihr Kommentar zusammen erklären das Problem (persönlich hätte ich eine separate Antwort gepostet und akzeptiert, da das Problem ziemlich anders war als von ihm beschrieben, aber dies funktioniert)
Michael Mrozek
Verstanden - danke für die Rückmeldung; Lektion gelernt!
Royce Williams

Antworten:

14

Wie wäre es damit?

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

# Sort the results.
sort | \

# Only show unique lines.
uniq

(Der Backslash muss als letztes Zeichen in diesen Zeilen verwendet werden.) Ich bin nicht sicher, ob dieser Ansatz portabel ist, aber er funktioniert mit dem aktuellen bash.

rozcietrzewiacz
quelle
Aha! (facepalm) Ich habe die Redewendung, die ich beim Posten der Frage verwendet habe, geändert, ohne es zu merken! Ich habe die Pipe am Anfang jeder Zeile platziert, und ich bin froh, dass ich damit aufhören kann, da ich weiß, dass diese Methode auf allen Systemen, die ich erreichen kann, sowohl in bash als auch in sh, gut funktioniert. Vielen Dank!
Royce Williams
Würden diese Kommentare nicht die Fortsetzung der Zeilen ruinieren?
Stuart P. Bentley
Solange sich vor jedem Kommentar eine leere Zeile befindet, funktioniert dies einwandfrei.
Royce Williams