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 :
bleibtvar
nach iv id = aufvalue
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