Mehrzeilige Befehlsketten kommentieren?

Mehrzeilige Befehlsketten kommentieren?

Ich habe oft Code, den ich durch lange UND/ODER-Anweisungen formatiere. Zum Beispiel:

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

Manchmal kann ein einzelner Schritt in einem Befehl wie dem obigen komplex sein. Deshalb möchte ich ihn kommentieren.

Angenommen, der cutBefehl wäre komplizierter als er hier tatsächlich ist. Dann möchte ich etwas tun wie:

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            # Here is a note
            | cut -d' ' -f5 \
            | tr --delete \;)

Mir ist klar, dass dies eine ungültige Syntax ist.

Aber ich bin gespannt, ob jemand sonst noch Strategien zum Kommentieren langer Befehlsketten hat?

Antwort1

Dies scheint in Bash dashusw. zu funktionieren:

#!/bin/sh
seq 20 |       # make a long list
grep '[234]'   # mut only take part of it

Gleiches gilt mit &&oder ||anstelle des Rohrs sowie innerhalb $( ... ).

Antwort2

Die Syntax Ihres Befehls ist nur deshalb ungültig, weil Sie die Zeilenumbrüche in jeder Zeile unnötigerweise maskieren.

Ihr Befehl,

gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

ist identisch mit

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  | cut -d' ' -f5 | tr --delete \;)

Mit anderen Worten: Aus Sicht der Shell handelt es sich überhaupt nicht um einen mehrzeiligen Befehl.

Das Einfügen eines Kommentars davor führt dazu, dass cutdie Befehlsersetzung nicht beendet wird (das Ende )wird als Kommentar ausgegeben):

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  # Here is a note | cut -d' ' -f5 | tr --delete \;)

Es besteht jedoch keine Notwendigkeit, die Zeilenumbrüche zu maskieren. Der folgende Code ist völlig gültig:

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            | cut -d' ' -f5
            | tr --delete \;)

Hier können Sie problemlos einen Kommentar einfügen:

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            # Here is a note
            | cut -d' ' -f5
            | tr --delete \;)

Dies ist kein Problem, da auf jeden Teil einer Pipeline ein oder mehrere Zeilenumbrüche folgen können und ein Kommentar vom Parser der Shell ignoriert wird.


Mit Blick auf die tatsächlicheCode, dies ist eine sicherere und portablere Variante (mit Ausnahme der ursprünglichen Version, grepbei der weiterhin nicht standardmäßige Erweiterungen verwendet werden müssen):

gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
            | grep -F 'option routers'
            # Here is a note
            | cut -d ' ' -f 5
            | tr -d ';' )

Antwort3

Außerdem unterstützt zsh, das Bash emulieren kann (rufen Sie es einfach als bash auf oder führen Sie es aus ), tatsächlichemulate bashMehrzeilige Befehle!

Führen Sie einfach bindkey -eoder bindkey "^[^M" self-insert-unmetaaus. Anschließend können Sie durch Drücken von M-Return zu einer neuen Zeile wechseln.

Es wird als ein Verlaufseintrag gespeichert. Sie können sich wie gewohnt mit den Pfeiltasten darin bewegen. Die Einträge werden nur gewechselt, wenn Sie in der oberen/unteren Zeile nach oben/unten gehen.

verwandte Informationen