Erweiterung der Tilde in zsh

11

Ich bin bei der Verwendung von FreeBSD auf dieses Verhalten von zsh gestoßen:

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

Das hat mich wirklich verwirrt, weil das gleiche in Bash gut funktioniert.

Ich kann touchDateien mit Tilde in zsh und dann lssie:

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

Zuerst nahm ich an, dass zsh nicht merkt, dass es einen Pfad danach gibt, of=also hat er sich nicht erweitert ~. Das automatische Vervollständigen von Dateinamen funktioniert jedoch einwandfrei. Wenn Sie einen vorhandenen Dateinamen verwenden, den Pfad mit beginnen ~und dann irgendwann die Tabulatortaste drücken, wird der Pfad in dem Befehl, den ich eingebe, erweitert.

Warum passieren wird zsh ~/test2zu dd, nicht /home/christoph/test2?

zsh verhält sich unter Linux genauso. Tatsächlich habe ich diese Befehle oben ausgeführt und ihre Ausgaben auf einen Linux-Computer kopiert.

UTF-8
quelle
Sie können $HOMEanstelle von verwenden ~.
Ilario Gelmetti

Antworten:

14

~wird nur in wenigen Zusammenhängen erweitert . POSIX, für die Standard - shAufträge echo a=~zur Ausgabe a=~(während beauftragt sie ~in erweitert werden a=~allein).

zshEs gibt jedoch eine magicequalsubstOption, mit der Sie ~erweitert werden können, =auch wenn sie nicht in Zuweisungen oder Argumenten zu den Pseudo-Schlüsselwörtern export/ typeset... enthalten ist.

Damit:

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

Beachten Sie, dass bash, wenn sie nicht in POSIX / shModus erweitert ~in word=~aber nur , wenn was ist auf der linken Seite der =sieht aus wie eine wörtliche unquoted bashVariablennamen (unabhängig davon , ob es in Argumenten typeset/ declare/ exportoder andere Befehl):

$ 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
quelle