I stumbled upon this behavior of zsh when using FreeBSD:
% dd if=/dev/zero bs=1M count=1 of=~/test2
dd: failed to open '~/test2': No such file or directory
This really confused me because the same thing works just fine in bash.
I can touch
files using tilde in zsh, and then ls
them:
% touch ~/test2
% ls ~/test2
/home/christoph/test2
At first, I assumed that zsh doesn't realize that there comes a path after of=
so it didn't expand ~
. But autocompleting file names works just fine. In fact, if use an existing file name, begin its path with ~
, and then hit Tab at some point, the path gets expanded in the command I'm typing in.
Why does zsh pass ~/test2
to dd
, not /home/christoph/test2
?
zsh behaves the same on Linux. In fact, I executed these commands above and copied their outputs on a Linux machine.
Best Answer
~
is expanded only in a few contexts. POSIX, for the standardsh
mandatesecho a=~
to outputa=~
(while it mandates~
to be expanded ina=~
alone).zsh
however has amagicequalsubst
option which you can use for~
to be expanded after=
even if it's not in assigments or arguments to theexport
/typeset
... pseudo-keywords.So:
Note that
bash
, when not in POSIX/sh
mode, expands~
inword=~
but only when what's on the left of=
looks like a literal unquotedbash
variable name (regardless of whether it's in arguments totypeset
/declare
/export
or any other command):