Expansão do til em zsh

11

Eu me deparei com esse comportamento do zsh ao usar o FreeBSD:

% dd if=/dev/zero bs=1M count=1 of=~/test2
dd: failed to open '~/test2': No such file or directory

Isso realmente me confundiu, porque a mesma coisa funciona muito bem no bash.

Eu posso toucharquivos usando til no zsh, e então lseles:

% touch ~/test2
% ls ~/test2
/home/christoph/test2

No começo, presumi que o zsh não percebesse que existe um caminho depois, of=para que ele não se expandisse ~. Mas os nomes de arquivos com preenchimento automático funcionam muito bem. De fato, se usar um nome de arquivo existente, iniciar seu caminho com ~e pressionar Tab em algum momento, o caminho será expandido no comando que estou digitando.

Por que o zsh passa ~/test2para dd, não /home/christoph/test2?

O zsh se comporta da mesma maneira no Linux. Na verdade, eu executei esses comandos acima e copiei suas saídas em uma máquina Linux.

UTF-8
fonte
Você pode usar em $HOMEvez de ~.
Ilario Gelmetti 22/04

Respostas:

14

~é expandido apenas em alguns contextos . POSIX, para os shmandatos padrão echo a=~de saída a=~(enquanto manda ~ser expandido a=~sozinho).

zshno entanto, tem uma magicequalsubstopção que você pode usar para ~ser expandida depois =mesmo que não esteja em atribuições ou argumentos para as pseudo-palavras-chave export/ typeset....

Assim:

$ echo a=~
a=~
$ set -o magicequalsubst
$ echo a=~
a=/home/chazelas

Observe que bash, quando não está no shmodo POSIX / , se expande ~, word=~mas apenas quando o que está à esquerda de se =parece com um bashnome de variável literal sem aspas (independentemente de estar em argumentos para typeset/ declare/ exportou 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=~
Stéphane Chazelas
fonte