Naboural jsem se do spousty skriptů shellu a někdy mě zmátly ty nejjednodušší věci. Dnes jsem narazil na skript, který široce využíval :
(dvojtečka) vestavěná bash.
Dokumentace se zdá být dostatečně jednoduchá:
: (a colon) : [arguments]
Nedělejte nic kromě rozšiřování argumentů a provádění přesměrování. Návratový stav je nula.
Nicméně dříve jsem to viděl pouze v ukázkách expanze shellu. Případ použití ve skriptu, na který jsem narazil, tuto strukturu široce využíval:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
Ve skutečnosti byly stovky grepů, ale jsou jen více stejných. Nejsou přítomna žádná přesměrování vstupu/výstupu kromě jednoduché struktury výše. Žádné návratové hodnoty se později ve skriptu nekontrolují.
Čtu to jako zbytečný konstrukt, který říká „nebo nedělej nic“. K čemu by mohlo posloužit ukončení těchto greps slovem „nebo nedělat nic“? V jakém případě by tato konstrukce způsobila jiný výsledek než pouhé vynechání || :
ze všech případů?
Přijatá odpověď:
Zobrazí se :
s ve vašem skriptu se používají místo true
. Pokud grep
nenajde v souboru shodu, vrátí nenulový výstupní kód; jak uvádí jw013 v komentáři, pokud errexit
je nastaven pravděpodobně pomocí -e
na řádku shebang by skript skončil, pokud by došlo k některému z grep
se nepodařilo najít shodu. Je zřejmé, že to autor nechtěl, a tak (s)přidal || :
aby byl stav ukončení tohoto konkrétního složeného příkazu vždy nulový, jako běžnější (podle mých zkušeností) || true
/|| /bin/true
.