TIL about bash's noclobber and a special redirection operator permalink
Today I learned about a special redirection operator in bash:
GNU Bash (and other POSIX-like shell environments) have a bunch of built in options that will modify the behavior of the environment when changed.
One of these is the
noclobber option that prevents redirecting
stdout of a command to overwrite a file if it already exists:
λ › ls CNAME CNAME λ › echo "This will fail" > CNAME zsh: file exists: CNAME
You can see the value of this shell option by using the
set -o command:
λ › set -o | rg noclobber noclobber on
You can turn it off using
set +o and suddenly you’ll be able to overwrite files using a vanilla
λ › set +o noclobber λ › set -o | rg noclobber noclobber off λ › echo "This will work" > CNAME λ › echo $? 0
This is usually enabled by default because safety.
But there’s also a way to explicitly override this setting - enter
λ › ls CNAME CNAME λ › echo "This works too" >| CNAME λ › echo $? 0
I learned this when building a bunch of scripts to help me analyze some source code that someday I hope to share. Specifically, I was getting tired of having to delete a file before re-running the script during development. This allowed me to make my commands more concise.
From this I learned of
noclobber and the shell builtin optiens!
DISCLAIMER: I actually learned about this last week but thought it wa sworth sharing. I’m surprised at how long it took me to find this!