Espansione della tilde in zsh


11

Mi sono imbattuto in questo comportamento di zsh quando ho usato FreeBSD:

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

Questo mi ha davvero confuso perché la stessa cosa funziona bene a Bash.

Posso touchfile usando tilde in zsh, e poi lsloro:

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

Inizialmente, supponevo che zsh non si rendesse conto che dopo c'è un percorso, of=quindi non si è espanso ~. Ma i nomi dei file completati automaticamente funzionano bene. In effetti, se usi un nome file esistente, inizia il suo percorso con ~, e poi premi Tab ad un certo punto, il percorso si espande nel comando che sto digitando.

Perché il zsh passa ~/test2a dd, non /home/christoph/test2?

zsh si comporta allo stesso modo su Linux. In effetti, ho eseguito questi comandi sopra e copiato i loro output su una macchina Linux.


Puoi usare $HOMEinvece di ~.
Ilario Gelmetti,

Risposte:


15

~si espande solo in alcuni contesti . POSIX, per l' output dei shmandati standard (mentre obbliga ad essere espanso da solo).echo a=~a=~~a=~

zshtuttavia ha magicequalsubstun'opzione che è possibile utilizzare per ~essere espanso dopo =anche se non è in assurzioni o argomenti per le pseudo-parole chiave export/ typeset...

Così:

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

Si noti che bash, quando non è in POSIX / shmodalità, si espande ~in word=~ma solo quando ciò che è a sinistra di =sguardi come un non quotate letterale bashnome di variabile (a prescindere dal fatto che sia in argomenti per typeset/ declare/ exporto di qualsiasi altro 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=~
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.