Expansão do til no zsh

7

Eu tropecei nesse 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 bem no bash.

Eu posso usar arquivos touch usando til em zsh e, em seguida, ls :

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

Inicialmente, eu assumi que o zsh não percebe que existe um caminho após of= , então ele não expandiu ~ . Mas o autocompletar nomes de arquivos funciona bem. Na verdade, se usar um nome de arquivo existente, comece seu caminho com ~ e, em seguida, pressione 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 ?

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

    
por UTF-8 26.06.2017 / 20:13

1 resposta

10

~ é 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).

No entanto,

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=~
    
por 26.06.2017 / 20:53

Tags