What is the use case of noop [:] in bash?
I searched for noop in bash (:), but was not able to find any good information. What is the exact purpose or use case of this operator?
I tried following and it's working like this for me:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Please let me know, any use case of this operator in real time or any place where it is mandatory to use it.
Solution 1:
It's there more for historical reasons. The colon builtin :
is exactly equivalent to true
. It's traditional to use true
when the return value is important, for example in an infinite loop:
while true; do
echo 'Going on forever'
done
It's traditional to use :
when the shell syntax requires a command but you have nothing to do.
while keep_waiting; do
: # busy-wait
done
The :
builtin dates all the way back to the Thompson shell, it was present in Unix v6. :
was a label indicator for the Thompson shell's goto
statement. The label could be any text, so :
doubled up as a comment indicator (if there is no goto comment
, then : comment
is effectively a comment). The Bourne shell didn't have goto
but kept :
.
A common idiom that uses :
is : ${var=VALUE}
, which sets var
to VALUE
if it was unset and does nothing if var
was already set. This construct only exists in the form of a variable substitution, and this variable substitution needs to be part of a command somehow: a no-op command serves nicely.
See also What purpose does the colon builtin serve?.
Solution 2:
I use it for if statements when I comment out all the code. For example you have a test:
if [ "$foo" != "1" ]
then
echo Success
fi
but you want to temporarily comment out everything contained within:
if [ "$foo" != "1" ]
then
#echo Success
fi
Which causes bash to give a syntax error:
line 4: syntax error near unexpected token `fi' line 4: `fi'
Bash can't have empty blocks (WTF). So you add a no-op:
if [ "$foo" != "1" ]
then
#echo Success
:
fi
or you can use the no-op to comment out the lines:
if [ "$foo" != "1" ]
then
: echo Success
fi