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 .