~ é expandido apenas em alguns contextos . POSIX, para o padrão sh manda echo a=~ para a saída a=~ (enquanto isso exige que ~ seja expandido em a=~ sozinho).
zsh tem uma opção magicequalsubst que você pode usar para ~ ser expandida após = , mesmo que não esteja em atribuições ou argumentos para a export / typeset ... pseudo- palavras-chave.
Então:
$ echo a=~
a=~
$ set -o magicequalsubst
$ echo a=~
a=/home/chazelas
Observe que bash , quando não está no modo POSIX / sh , expande ~ em word=~ , mas apenas quando o que está à esquerda de = se parece com um nome de variável bash literal não indicado se está em argumentos para typeset / declare / export ou qualquer outro comando):
$ bash -c 'echo a=~'
a=/home/chazelas
$ bash -c 'echo "a"=~'
a=~
$ bash -c 'var=a; echo $var=~'
a=~
$ bash -c 'echo a.b=~'
a.b=~
$ (exec -a sh bash -c 'echo a=~')
a=~