Non eseguo molto script di shell, quindi sono rimasto un po sorpreso quando ho letto la documentazione per git submodule e ho visto la sintassi usata in questa documentazione:
A Il ritorno diverso da zero dal comando in qualsiasi sottomodulo provoca il termine dellelaborazione. Questo può essere ignorato aggiungendo
|| :alla fine del comando.
Ho dovuto cercare che || : fosse unabbreviazione per forzare luscita di un comando con successo. Ogni volta che ho dovuto eseguire correttamente luscita di un comando , Ho utilizzato || true. || : è considerato più idiomatico?
Commenti
Risposta
true non è stato integrato nella shell Bourne. : lo è sempre stato (era il modo di inserire commenti prima dellintroduzione di #).
Questo e perché è probabilmente il motivo principale per cui le persone preferiscono : rispetto a true.
Nota unaltra differenza in Shell POSIX (per bash, solo in modalità POSIX): mentre true è un normale builtin (non deve nemmeno esserlo) , : è un builtin speciale . Ciò ha alcune implicazioni, la maggior parte delle quali è improbabile che abbia alcun impatto in questo caso particolare:
-
Se un comando
:fallisce, anche a causa di un reindirizzamento fallito, che causa la chiusura della shell. In pratica, questo probabilmente non farà la differenza a meno che non passi i reindirizzamenti a:$ 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 :,varrimane impostato suvaluedopo:restituisce, non nel caso ditrue:$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
Tieni presente inoltre che || true funziona nelle shell di rc e csh famiglie ma non || : (ma non per annullare set -e in csh).
|| : non è uguale a :. Significa o esegui : altrimenti (ovvero, se la pipeline precedente fallisce).
set -e false
Farebbe uscire la shell a causa di set -e (nota anche come opzione errexit) e ha uno stato di uscita diverso da zero (errore). Leffetto set -e viene annullato se il comando che restituisce uno stato di uscita diverso da zero viene utilizzato come condizione come in:
if false; then ... while false; do ... false && : ... false || : ...
false && : annulla solo set -e. false || : annulla leffetto di set -e e imposta lo stato di uscita su 0 quindi è più idiomatico per dire che vogliamo ignorare un codice di uscita di errore del comando. La maggior parte sosterrebbe che || true è più leggibile (esprime lintenzione in modo più chiaro).
Commenti
-
&& :è fantastico, ci sono documenti o ulteriori letture su questo? Google non riesce a trovare questo tipo di parole chiave …
Risposta
La maggior parte di queste risposte non riesce affrontare luso più comune di :.
Innanzitutto, questa discussione non è correlata a nessuna shell che non sia una Bourne shell (sh) derivato. Detto questo, tutte le shell derivate Bourne vedono true e : come la stessa cosa. I programmatori erano incoraggiati a utilizzare : invece di true, perché : è sempre un integrato mentre in passato cerano casi in cui true non era sempre un built-in.
: ha due usi. Non è un sinonimo di #, ma ha una funzione diversa. Quando si esegue il debug dello script in set -x, le righe in cui viene utilizzato # vengono eliminate dal parser e completamente ignorate, mentre le righe con : vengono analizzati e valutati. Questo è molto utile nel debugging poiché sotto -x vengono mostrate quelle righe e il loro valore dopo la valutazione.È come inserire le istruzioni print nel codice che vengono visualizzate solo in modalità -x. Fai attenzione ai valori dopo : poiché sono codice reale e gli effetti collaterali possono influenzare il tuo programma.
Commenti
- Qual è il secondo utilizzo?
Risposta
Generalmente, in bash, il i due punti : e true sono equivalenti.
È | | : considerato più idiomatico?
Penso che sia basato sul contesto .
Se desideri che return value o condition sia sempre vero , dovresti utilizzare la parola chiave true, “s renderà il tuo codice più chiaro e farà sapere agli spettatori che desideri enfatizzare il valore true , ovvero:
while true; do something
o
<commnad> RETURN_VALUE= $? || true
E se desideri non fare nulla o NOP nella shell, devi utilizzare i due punti :
if condition then : # DO NOTHING HERE else do something fi
o
while conditon do : # DO NOTHING HERE done
||:(senza spazio) è valido anche in bash. Funziona come|| :o|| true.