truewurde nicht in die Bourne-Shell eingebaut. :immer war (es war der Weg, Kommentare einzugeben, bevor #eingeführt wurde).
Das, und weil es kürzer Typ ist , ist wahrscheinlich der Hauptgrund , warum Menschen es vorziehen , :über true.
Beachten Sie einen weiteren Unterschied bei POSIX-Shells (z. B. bashnur im POSIX-Modus): while trueist ein reguläres Builtin (muss nicht einmal eingebaut sein), :ist ein spezielles Builtin. Dies hat einige Auswirkungen, von denen die meisten in diesem speziellen Fall wahrscheinlich keine Auswirkungen haben:
Wenn ein :Befehl fehlschlägt, auch aufgrund einer fehlgeschlagenen Umleitung, wird die Shell beendet. In der Praxis wird das wahrscheinlich keinen Unterschied machen, wenn Sie Weiterleitungen an weiterleiten:
$ 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 :, varbleibt valuenach :Rücksendung gesetzt, nicht bei true:
$ var=1; var=2 : ; echo "$var"
2
$ var=1; var=2 true; echo "$var"
1
Beachten Sie auch , dass die || trueArbeiten in Schalen von der rcund cshFamilien , aber nicht || :(aber nicht abbrechen set -ein csh).
|| :ist nicht dasselbe wie :. Es bedeutet oder läuft :anders (das heißt, wenn die vorhergehende Pipeline ausfällt).
set -e
false
Würde bewirken , dass die Schale zu Ausfahrt aufgrund set -eund falsehat einen von Null (failure) Exit - Status. Der set -eEffekt 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 && :nur storniert set -e. false || :Bricht set -eden Exit-Status ab und setzt ihn auf, 0so dass es idiomatischer ist, zu sagen, dass wir einen fehlerhaften Exit-Code des Befehls ignorieren möchten. Die meisten würden argumentieren, dass dies || truebesser lesbar ist (was die Absicht klarer vermittelt).
||:(ohne Leerzeichen) auch in bash gültig ist. Es macht das Gleiche wie|| :oder|| true.