Expansion de tilde dans zsh

11

Je suis tombé sur ce comportement de zsh lors de l'utilisation de FreeBSD:

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

Cela m'a vraiment dérouté car la même chose fonctionne très bien en bash.

Je peux les touchfichiers en utilisant tilde dans zsh, puis lseux:

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

Au début, j'ai supposé que zsh ne réalisait pas qu'il y avait un chemin après, of=donc il ne s'est pas développé ~. Mais la saisie automatique des noms de fichiers fonctionne très bien. En fait, si vous utilisez un nom de fichier existant, commencez son chemin par ~, puis appuyez sur Tab à un moment donné, le chemin est développé dans la commande que je tape.

Pourquoi zsh passe-t-il ~/test2à dd, non /home/christoph/test2?

zsh se comporte de la même manière sous Linux. En fait, j'ai exécuté ces commandes ci-dessus et copié leurs sorties sur une machine Linux.

UTF-8
la source
Vous pouvez utiliser à la $HOMEplace de ~.
Ilario Gelmetti

Réponses:

14

~n'est développé que dans quelques contextes . POSIX, pour la sortie des shmandats standard (alors qu'il doit être étendu en seul).echo a=~a=~~a=~

zsha cependant une magicequalsubstoption que vous pouvez utiliser pour ~être développée après, =même si elle n'est pas dans les affectations ou les arguments des pseudo-mots clés export/ typeset...

Donc:

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

Notez que bash, lorsqu'il n'est pas en shmode POSIX / , se développe ~dans word=~mais uniquement lorsque ce qui se trouve à gauche =ressemble à un bashnom de variable littéral sans guillemets (qu'il s'agisse d'arguments de typeset/ declare/ exportou de toute autre commande):

$ 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
la source