On 2021-08-31 at 11:04 +1000, Shineru wrote:
> zsh 5.8.1. Arch GNU/Linux
>
> zsh: echo "hello" | tr [:lower:] [:upper:]
> zsh: no matches found: [:lower:]
setopt nonomatch
or: unsetopt nomatch
but: both of these are dangerous, because there's a real quoting issue
here.
% touch l p
% echo "hello" | tr [:lower:] [:upper:]
heppo
bash$ echo "hello" | tr [:lower:] [:upper:]
heppo
Without quoting,
[:lower:] matches any of: l o w e r :
[:upper:] matches any of: u p e r :
so the globbing turns the pipeline into:
echo "hello" | tr "l" "p"
By default, zsh complains about unmatched patterns, rather than letting
them fall through silently. Falling through leads to this sort of
"foot-gun" construct, where shells encourage you to do something which
"only works as long as X is not true", instead of having reliable code.
So you want, for safety, in any shell which resembles POSIX at all:
echo 'hello' | tr '[:lower:]' '[:upper:]'
(This probably belongs on zsh-users.)
-Phil