true
nie został wbudowany w powłokę Bourne'a. :
zawsze tak było (był to sposób wprowadzania komentarzy przed #
wprowadzeniem).
To, a bo to krótsze typu jest prawdopodobnie głównym powodem ludzie wolą :
się true
.
Zauważ kolejną różnicę w powłokach POSIX (dla bash
, tylko w trybie POSIX): chociaż true
jest to zwykłe narzędzie wbudowane (nawet nie musi być wbudowane), :
to jest ono narzędziem specjalnym . Ma to kilka implikacji, z których większość prawdopodobnie nie będzie miała żadnego wpływu w tym konkretnym przypadku:
Jeśli :
polecenie nie powiedzie się, w tym z powodu nieudanego przekierowania, spowoduje to zamknięcie powłoki. W praktyce prawdopodobnie nie będzie to miało znaczenia, chyba że przekażesz przekierowania do:
$ sh -c ': > / ; echo HERE'
sh: 1: cannot create /: Is a directory
$ sh -c 'true > /; echo HERE'
sh: 1: cannot create /: Is a directory
HERE
w var=value :
, var
pozostaje ustawiony na value
po :
powrocie, nie w przypadku true
:
$ var=1; var=2 : ; echo "$var"
2
$ var=1; var=2 true; echo "$var"
1
Zauważ też, że || true
działa w powłokach rc
i csh
rodzin, ale nie || :
(ale nie w celu anulowania set -e
w csh
).
|| :
to nie to samo co :
. Oznacza to lub działa w :
inny sposób (to znaczy, jeśli poprzedni potok się nie powiedzie).
set -e
false
Spowodowałoby muszlę do zjazdu powodu set -e
i false
ma niezerową (awaria) stan wyjścia. set -e
Efekt jest anulowana, jeśli polecenie, które zwraca kod wyjścia niż zero jest używany jako warunku jak w:
if false; then ...
while false; do ...
false && : ...
false || : ...
false && :
tylko anuluje set -e
. false || :
anuluje set -e
i ustawia status wyjścia na 0
tak, więc bardziej idiomatyczne jest stwierdzenie, że chcemy zignorować kod wyjścia błędu polecenia. Większość twierdzi, że || true
jest to bardziej czytelne (wyraźniej oddaje intencję).
||:
(bez spacji) obowiązuje również w bash. Robi to samo co|| :
lub|| true
.