I've hacked on a lot of shell scripts, and sometimes the simplest things baffle me. Today I ran across a script that made extensive use of the :
(colon) bash builtin.
The documenation seems simple enough:
: (a colon) : [arguments]
Do nothing beyond expanding arguments and performing redirections. The return status is zero.
However I have previously only seen this used in demonstrations of shell expansion. The use case in the script I ran across made extensive use of this structure:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
There were actually hundreds of greps, but they are just more of the same. No input/output redirects are present other than the simple structure above. No return values are checked later in the script.
I am reading this as a useless construct that says "or do nothing". What purpose could ending these greps with "or do nothing" serve? In what case would this construct cause a different outcome than simply leaving off the || :
from all instances?
Best Answer
It appears the
:
s in your script are being used in lieu oftrue
. Ifgrep
doesn't find a match in the file, it will return a nonzero exit code; as jw013 mentions in a comment, iferrexit
is set, probably by-e
on the shebang line, the script would exit if any of thegrep
s fail to find a match. Clearly, that's not what the author wanted, so (s)he added|| :
to make the exit status of that particular compound command always zero, like the more common (in my experience)|| true
/|| /bin/true
.