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 :
,var
rimane impostato suvalue
dopo:
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
.