Włamałem się do wielu skryptów powłoki i czasami najprostsze rzeczy mnie zaskakują. Dzisiaj natknąłem się na skrypt, który szeroko wykorzystywał :
wbudowane bash (dwukropek).
Documenation wydaje się dość proste:
: (a colon) : [arguments]
Nie rób nic poza rozszerzaniem argumentów i przeprowadzaniem przekierowań. Status powrotu wynosi zero.
Jednak wcześniej widziałem to tylko w demonstracjach ekspansji powłoki. Przypadek użycia w skrypcie, na który natknąłem się, w dużym stopniu wykorzystywał tę strukturę:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
W rzeczywistości były setki grepów, ale są one po prostu takie same. Nie ma żadnych przekierowań wejścia / wyjścia poza prostą strukturą powyżej. Żadne zwracane wartości nie są sprawdzane później w skrypcie.
Czytam to jako bezużyteczną konstrukcję, która mówi „albo nic nie rób”. Jaki cel może mieć zakończenie tych grepów „lub nic nie robić”? W jakim przypadku ten konstrukt spowodowałby inny wynik niż zwyczajne pominięcie || :
wszystkich przypadków?
:
jako alternatywy dlatrue
. Być możeerrexit
jest ustawiony, a autor nie dba o status wyjścia niektórych poleceń.