I am updating an old script and came across a pattern I am unfamiliar with:
# NOTE The | : always returns true so the <cmd> doesn't fail
<cmd> | :
I've only ever seen this pattern used in a fork bomb example. If someone were to ask me how to accomplish what is stated in the comment, I would have suggested:
<cmd> ||:
Before I chalk this up to a typo, has anyone seen this pattern and able to explain its use-case?
It's a typo that also happens to have a similar effect. Differences:
cmd | : pipes cmd's stdout to :. Since : exits immediately, if cmd writes anything it will likely be hit with a SIGPIPE signal or EPIPE error, typically killing it.†
cmd | : runs cmd in a subshell, nullifying environmental changes like var=value or cd /dir. Compare cd /tmp || : to cd /tmp | :.cmd | : won't work if set -o pipefail is enabled.Based on the comment it should be || :.
† Technically, it's a race condition. cmd could write something before : exits, though it's unlikely. Or even more unlikely, if cmd wrote a lot it and filled up the pipe's buffer it would actually block until : exits, at which point its pending write() syscall would receive an EPIPE/SIGPIPE. You can simulate this with strace -e write yes | { sleep 0.1; :; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With