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


36

Non eseguo molto script di shell, quindi sono rimasto un po 'sorpreso mentre stavo leggendo la documentazionegit submodule e ho visto la sintassi che hanno usato in questa documentazione:

Un ritorno diverso da zero dal comando in qualsiasi sottomodulo provoca la chiusura dell'elaborazione. Questo può essere sovrascritto aggiungendo || :alla fine del comando.

Ho dovuto cercare quella che || :era una scorciatoia per forzare un comando ad uscire con successo. Ogni volta che ho dovuto eseguire correttamente un comando di uscita, l'ho usato || true. È || :considerato più idiomatico?


Vale la pena notare che ||:(senza spazio) è valido anche in bash. Fa la stessa cosa di || :o || true.
Bruno Bronosky,

Risposte:


38

truenon è stato incorporato nella shell Bourne. :lo è sempre stato (era il modo di inserire commenti prima #dell'introduzione).

Questo, e perché è più breve per tipo è probabilmente la ragione principale per la gente preferisce :sopra true.

Nota un'altra differenza nelle shell POSIX (per bash, solo in modalità POSIX): mentre trueè un built-in normale (non deve nemmeno essere incorporato), :è un built-in speciale . Ciò ha alcune implicazioni, la maggior parte delle quali è improbabile che abbiano un impatto in questo caso particolare:

  • Se un :comando fallisce, anche a causa di un reindirizzamento fallito, ciò provoca l'uscita della shell. In pratica, ciò probabilmente non farà differenza a meno che non passi a reindirizzamenti:

    $ 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 su valuedopo i :ritorni, non nel caso di true:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1

Si noti inoltre che i || truelavori in gusci di rce cshfamiglie, ma non || :(ma non per annullare set -ein csh).

|| :non è lo stesso di :. Indica o esegue :diversamente (ovvero, se la pipeline precedente non riesce).

set -e
false

Causerebbe il guscio di uscita a causa di set -ee falseha uno stato non-zero (guasto). L' set -eeffetto 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 && :cancella solo set -e. false || :annulla set -ee imposta lo stato di uscita in 0modo che sia più idiomatico dire che vogliamo ignorare un codice di uscita di errore del comando. Molti direbbero che || trueè più leggibile (trasmette l'intenzione più chiaramente).


5
&& :è geniale, ci sono dei documenti o ulteriori letture al riguardo? Google non riesce a cercarmi questo tipo di parole chiave ...
Ian Bytchek,

5

Generalmente, in bash, il colon :ed trueè equivalente.

È || : considerato più idiomatico?

Penso che sia basato sul contesto .

Se vuoi un return value, o a conditionè sempre vero, dovresti usare una trueparola chiave, renderà il tuo codice più chiaro e farà sapere agli spettatori che vuoi enfatizzare il valore vero , cioè:

while true; do something

o

<commnad>
RETURN_VALUE= $? || true

E se non vuoi fare nulla , o NOPnella shell, dovresti usare i due punti:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

o

while conditon
do
    : # DO NOTHING HERE
done

5

Molte di queste risposte non riescono ad affrontare l'uso più comune di :.

Innanzitutto, questa discussione non è correlata a nessuna shell che non sia un derivato shell Bourne ( sh). Detto questo, tutte le conchiglie derivate Bourne vedono truee :come la stessa cosa. I programmatori erano incoraggiati a usare :invece di true, perché :è sempre un built-in mentre c'erano casi in cui truenon era sempre un built-in.

:ha due usi. Non è sinonimo di #, ma ha una funzione diversa. Quando si esegue il debug dello script in a set -x, le righe in cui #viene utilizzato vengono eliminate dal parser e totalmente ignorate, mentre le righe con :vengono analizzate e valutate. Questo è veramente utile nel debug poiché sotto -xquelle linee sono mostrate e il loro valore dopo la valutazione viene visualizzato. È come mettere delle printistruzioni nel tuo codice che vengono visualizzate solo in -xmodalità. Fai attenzione ai valori dopo il :fatto che sono codice reale e gli effetti collaterali possono influenzare il tuo programma.


1
Qual è il secondo uso?
Peter Mortensen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.