Was in einem Bash-Skript idiomatischer ist: `|| true` oder `|| : `?

Ich mache nicht besonders viel Shell-Scripting, daher war ich ein wenig überrascht, als ich las Die Dokumentation für git submodule und ich haben die in dieser Dokumentation verwendete Syntax gesehen:

A. Wenn der Befehl in einem Submodul nicht Null ist, wird die Verarbeitung beendet. Dies kann überschrieben werden, indem am Ende des Befehls || : hinzugefügt wird.

Ich musste nachschlagen, dass || : eine Abkürzung war, um einen Befehl zum erfolgreichen Beenden zu zwingen. Immer wenn ich einen Befehl erfolgreich beenden musste Ich habe || true verwendet. Wird || : als idiomatischer angesehen?

Kommentare

  • Es ' Es ist erwähnenswert, dass ||: (ohne Leerzeichen) auch in bash gültig ist. Es funktioniert genauso wie || : oder || true.

Antwort

true wurde nicht in die Bourne-Shell integriert. : war immer (es war die Art, Kommentare einzugeben, bevor # eingeführt wurde).

Das und weil Die kürzere Eingabe ist wahrscheinlich der Hauptgrund, warum Benutzer : true vorziehen.

Beachten Sie einen weiteren Unterschied in POSIX-Shells (für bash nur im POSIX-Modus): während true ein reguläres eingebautes ist (muss nicht einmal eingebaut werden) , : ist ein spezielles . Dies hat einige Auswirkungen, von denen die meisten in diesem speziellen Fall wahrscheinlich keine Auswirkungen haben:

  • Wenn ein : -Befehl fehlschlägt, Einschließlich aufgrund einer fehlgeschlagenen Umleitung wird die Shell beendet. In der Praxis wird dies wahrscheinlich keinen Unterschied machen, es sei denn, Sie übergeben Weiterleitungen an :

    $ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE 
  • in var=value : bleibt var nach iv id = auf value gesetzt „2e9c356ccf“>

wird zurückgegeben, nicht im Fall von true:

$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1 

Beachten Sie auch, dass || true in Shells der rc und csh funktioniert Familien, aber nicht || : (aber nicht um set -e in csh abzubrechen).

|| : ist nicht dasselbe wie :. Es bedeutet oder : andernfalls (dh wenn die vorhergehende Pipeline ausfällt).

set -e false 

Würde dazu führen, dass die Shell aufgrund von set -e (auch bekannt als errexit Option) und hat einen Exit-Status ungleich Null (Fehler). Der Effekt set -e wird abgebrochen, wenn der Befehl, der einen Exit-Status ungleich Null zurückgibt, als Bedingung verwendet wird, wie in:

if false; then ... while false; do ... false && : ... false || : ... 

false && : bricht nur set -e ab. false || : hebt den Effekt von set -e auf und setzt den Exit-Status auf 0, was idiomatischer ist um zu sagen, dass wir einen Fehler-Exit-Code des Befehls ignorieren möchten. Die meisten würden argumentieren, dass || true besser lesbar ist (die Absicht klarer vermittelt).

Kommentare

  • && : ist brillant. Gibt es Dokumente oder weitere Informationen dazu? Google versucht nicht, diese Art von Keywords zu finden …

Antwort

Die meisten dieser Antworten schlagen fehl Behandeln Sie die häufigste Verwendung von :.

Erstens bezieht sich diese Diskussion nicht auf eine Shell, die keine Bourne-Shell (sh) Ableitung. Das heißt, alle Bourne-Derivat-Shells sehen true und : als dasselbe. Programmierer wurden früher dazu ermutigt, : anstelle von true zu verwenden, da : immer a ist eingebaut, während es früher Fälle gab, in denen true nicht immer eingebaut war.

: zwei Verwendungen. Es ist kein Synonym für #, hat aber eine andere Funktion. Beim Debuggen Ihres Skripts unter einer set -x werden Zeilen, in denen # verwendet wird, vom Parser gelöscht und vollständig ignoriert, während Zeilen mit : werden analysiert und ausgewertet. Dies ist beim Debuggen sehr nützlich, da unter -x diese Zeilen angezeigt werden und ihr Wert nach der Auswertung angezeigt wird.Es ist so, als würden Sie print -Anweisungen in Ihren Code einfügen, die nur im -x -Modus angezeigt werden. Seien Sie vorsichtig mit den Werten nach :, da es sich um echten Code handelt und die Nebenwirkungen Ihr Programm beeinflussen können.

Kommentare

  • Was ist die zweite Verwendung?

Antwort

Im Allgemeinen wird in bash die Doppelpunkt : und true ist äquivalent.

ist | | : Wird als idiomatischer angesehen?

Ich denke, es basiert auf dem -Kontext .

Wenn Sie eine return value oder eine condition wünschen, ist dies immer der Fall Wenn Sie das Schlüsselwort true verwenden, wird Ihr Code klarer und die Betrachter wissen, dass Sie den Wert hervorheben möchten true , dh:

while true; do something 

oder

<commnad> RETURN_VALUE= $? || true 

Und wenn Sie nichts tun möchten oder NOP In der Shell sollten Sie den Doppelpunkt :

if condition then : # DO NOTHING HERE else do something fi 

oder

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.