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 touch
Dateien mit Tilde in zsh und dann ls
sie:
% 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 ~/test2
zu 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.
$HOME
anstelle von verwenden~
.Antworten:
~
wird nur in wenigen Zusammenhängen erweitert . POSIX, für die Standard -sh
Aufträgeecho a=~
zur Ausgabea=~
(während beauftragt sie~
in erweitert werdena=~
allein).zsh
Es gibt jedoch einemagicequalsubst
Option, mit der Sie~
erweitert werden können,=
auch wenn sie nicht in Zuweisungen oder Argumenten zu den Pseudo-Schlüsselwörternexport
/typeset
... enthalten ist.Damit:
Beachten Sie, dass
bash
, wenn sie nicht in POSIX /sh
Modus erweitert~
inword=~
aber nur , wenn was ist auf der linken Seite der=
sieht aus wie eine wörtliche unquotedbash
Variablennamen (unabhängig davon , ob es in Argumententypeset
/declare
/export
oder andere Befehl):quelle