Che è più idiomatico in uno script bash: `|| true` o `|| : `?

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

  • It ' vale la pena notare che ||: (senza spazio) è valido anche in bash. Funziona come || : o || true.

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 su value dopo : restituisce, non nel caso di true:

    $ 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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *