Nach dieser Antwort und meinem eigenen Verständnis wird die Tilde in das Ausgangsverzeichnis erweitert:
$ echo ~
/home/braiam
Nun, wann immer ich möchte, dass die Shell-Erweiterung funktioniert, dh wenn Variablennamen wie verwendet $FOO
werden und unerwartete Zeichen, Leerzeichen usw. nicht unterbrochen werden, sollte man doppelte Anführungszeichen verwenden "
:
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
Warum funktioniert diese Erweiterung nicht mit der Tilde?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
--path ~/myfile
erweitert wird, dies--path=~/myfile
jedoch nicht tut.Antworten:
Der Grund dafür ist, dass Tilde in doppelten Anführungszeichen
~
keine besondere Bedeutung hat und als wörtlich behandelt wird.POSIX definiert doppelte Anführungszeichen als:
Außer $, `, \und @, andere Zeichen als wörtliche in doppelten Anführungszeichen behandelt.
quelle
$HOME
.~
, zum Beispiells -l ~/"My Documents"
Die Tilde-Erweiterung wird von POSIX definiert als:
Die kürzeste Antwort lautet also "weil es so definiert ist": Das Zitieren eines der Zeichen im Präfix, einschließlich des
~
, unterdrückt die Erweiterung.Außerdem wird die Erweiterung so definiert, dass sie immer ein einzelnes Wort ergibt, sodass keine Anführungszeichen erforderlich sind:
Wenn für einen Teil des Pfads Anführungszeichen erforderlich sind, der Rest jedoch ein Tilde-Präfix ist, können Sie die Tilde-Erweiterung und das normale Anführen von Anführungszeichen direkt kombinieren:
Was das "Warum" angeht: Da es keine vorstellbare Verwendung für das Teilen von Wörtern
~
gibt, sollte dies das Standardverhalten sein, anstatt dass es in Anführungszeichen gesetzt wird. Da es nicht erforderlich ist, es zu zitieren,~
wäre es eine unnötige Komplikation, in Anführungszeichen eine besondere Bedeutung zu setzen. Und natürlich kann es aus historischen Gründen nicht geändert werden, selbst wenn dies wünschenswert wäre.quelle
""
.~
stammt aus der C-Shell, lange bevor sie der Korn-Shell und später der POSIX-Shell-Spezifikation hinzugefügt wurde.In der C-Shell
~
befand sich ein Globbing-Operator (erweitert durch die gleiche Routine wie derjenige, der*.txt
zum Beispiel erweitert wurde), so dass der Rest des Globbing nicht in doppelten Anführungszeichen ausgeführt wurde.quelle
Dies ist zwar keine Antwort darauf, warum es so konzipiert ist, aber Sie verwenden es,
$HOME
wenn Sie es ersetzen müssen, da dies im Wesentlichen das ist, was es~
tut.quelle
~otheruser
~otheruser
zeigt, wie schlecht es war,~
Variablen und andere Dinge, die in doppelte Anführungszeichen eingeschlossen sind , anders zu behandeln .