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 touch
arquivos usando til no zsh, e então ls
eles:
% 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 ~/test2
para 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.
$HOME
vez de~
.Respostas:
~
é expandido apenas em alguns contextos . POSIX, para ossh
mandatos padrãoecho a=~
de saídaa=~
(enquanto manda~
ser expandidoa=~
sozinho).zsh
no entanto, tem umamagicequalsubst
opção que você pode usar para~
ser expandida depois=
mesmo que não esteja em atribuições ou argumentos para as pseudo-palavras-chaveexport
/typeset
....Assim:
Observe que
bash
, quando não está nosh
modo POSIX / , se expande~
,word=~
mas apenas quando o que está à esquerda de se=
parece com umbash
nome de variável literal sem aspas (independentemente de estar em argumentos paratypeset
/declare
/export
ou qualquer outro comando):fonte