Ho hackerato molti script di shell e a volte le cose più semplici mi lasciano perplesso. Oggi mi sono imbattuto in uno script che faceva ampio uso di :
(due punti) bash integrato.
La documentazione sembra abbastanza semplice:
: (a colon) : [arguments]
Non fare altro che espandere argomenti ed eseguire reindirizzamenti. Lo stato del reso è zero.
Tuttavia in precedenza l'ho visto utilizzato solo nelle dimostrazioni di espansione della shell. Il caso d'uso nello script in cui mi sono imbattuto ha fatto ampio uso di questa struttura:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
In realtà c'erano centinaia di grep, ma sono più o meno gli stessi. Non sono presenti reindirizzamenti di input/output oltre alla semplice struttura di cui sopra. Nessun valore restituito viene verificato più avanti nello script.
Sto leggendo questo come un costrutto inutile che dice "o non fare nulla". A quale scopo potrebbe servire porre fine a questi greps con "o non fare nulla"? In quale caso questo costrutto causerebbe un risultato diverso rispetto alla semplice interruzione di || :
da tutte le istanze?
Risposta accettata:
Appare il :
s nel tuo script vengono utilizzati al posto di true
. Se grep
non trova una corrispondenza nel file, restituirà un codice di uscita diverso da zero; come jw013 menziona in un commento, se errexit
è impostato, probabilmente da -e
sulla riga shebang, lo script sarebbe uscito se uno qualsiasi dei grep
s non riesce a trovare una corrispondenza. Chiaramente, non è quello che voleva l'autore, quindi ha aggiunto || :
per rendere lo stato di uscita di quel particolare comando composto sempre zero, come il più comune (nella mia esperienza) || true
/|| /bin/true
.