
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 cut
Befehl 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 dash
usw. 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 cut
die 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, grep
bei 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 bash
Mehrzeilige Befehle!
Führen Sie einfach bindkey -e
oder bindkey "^[^M" self-insert-unmeta
aus. 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.