Expansión de tilde en zsh

11

Me topé con este comportamiento de zsh cuando uso FreeBSD:

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

Esto realmente me confundió porque lo mismo funciona bien en bash.

Puedo toucharchivos usando tilde en zsh, y luego lsellos:

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

Al principio, asumí que zsh no se da cuenta de que viene un camino después, of=por lo que no se expandió ~. Pero los nombres de archivos de autocompletado funcionan bien. De hecho, si usa un nombre de archivo existente, comience su ruta con ~, y luego presione Tab en algún momento, la ruta se expande en el comando que estoy escribiendo.

¿Por qué zsh pasa ~/test2a dd, no /home/christoph/test2?

zsh se comporta igual en Linux. De hecho, ejecuté estos comandos anteriores y copié sus resultados en una máquina Linux.

UTF-8
fuente
Puedes usar en $HOMElugar de ~.
Ilario Gelmetti

Respuestas:

14

~se expande solo en unos pocos contextos . POSIX, para los shmandatos estándar echo a=~a la salida a=~(mientras que exige ~expandirse a=~solo).

zshsin embargo, tiene una magicequalsubstopción que puede usar para ~expandirse =incluso si no está en asignaciones o argumentos a las export/ typeset... pseudo-palabras clave.

Entonces:

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

Tenga en cuenta que bash, cuando no está en POSIX / shmodo, se expande ~en word=~pero sólo cuando lo que está en el lado izquierdo de la =apariencia como un literal sin comillas bashnombre de la variable (independientemente de si está en argumentos a typeset/ declare/ exporto cualquier otro 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
fuente