Earlier quoted context omitted.
The only thing to keep in mind about Zsh parameter expansion is that unquoted empty values will be dropped entirely, while quoted empty values will be treated like the empty string '': show_nargs() { print $# } q= show_nargs $q # 0 show_nargs "$q" # 1 So it doesn't completely solve the need for defensive quoting, but at least it mitigates the need for the most part.
Ouch, that is a sharp corner: $ echo 'aaa' > a.txt $ echo 'bbb' > b.txt $ TMP_DIR="" # Mistake! Missing arg, failed search, typo'd name, etc. $ cp a.txt b.txt $TMP_DIR $ cat b.txt aaa $ # The contents of b.txt are lost.
Actually there's a wave of unixy tools being written in Go and Rust and I think there might be a suitable cp replacement already, but it's up to distros to package it.