Ich bin mir sicher, dass dies eine grundlegende Frage ist, aber kann mir jemand erklären, warum ich Folgendes kann:
cd ~
cd bin
cd ~/bin
cd 'bin'
Aber nicht
cd '~'
cd '~/bin'
Ich muss zu cd
einem Verzeichnispfad mit einem Leerzeichen in einem der Verzeichnisnamen, also benötige ich die Anführungszeichen (es ist Windows Program Files
unter Wein). Ich kann es mit zwei cd
Befehlen umgehen, aber warum kann ich keine ~
Anführungszeichen setzen?
Wenn ich schreibe cd '~'
(oder cd "~"
) erhalte ich:
bash: cd: ~: No such file or directory
command-line
bash
B.Tanner
quelle
quelle
cd
in ein Verzeichnis mit dem Namen~
wechseln?cd
alles zusammen vermeiden . Verwenden Sie Variablen, um Pfadnamen zu speichern, die Sie nicht mehrmals eingeben möchten, z. B.pf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
/
oderNUL
?cd ./~
Antworten:
Wie @karel in seiner Antwort angemerkt hat,
~
handelt es sich um ein Sonderzeichen, das von Bash in das Home-Verzeichnis des aktuellen Benutzers erweitert wird. Siehe Bashs Handbuch zu "Tilde Expansion" oder suchen Sie in der Manpage (man bash
) nach der Überschrift "Tilde Expansion" .Jede Art von Anführungszeichen
~
verhindert diese Tilde-Erweiterung.Um Ihre Frage zu beantworten, wie Sie es weiterhin
cd
in ein Verzeichnis mit Leerzeichen im Namen verwenden können, gibt es einige Alternativen:Lassen Sie Anführungszeichen weg und schließen Sie die Leerzeichen stattdessen mit Backslashes:
Zitiere den Rest des Pfades, aber lasse sie um die Tilde und den ersten Schrägstrich herum weg:
Wie Sie sehen, können Sie Zeichenfolgen in Anführungszeichen und nicht in Anführungszeichen gesetzte Zeichenfolgen in Bash verketten, indem Sie sie einfach ohne Leerzeichen nebeneinander schreiben.
Verwenden Sie die Umgebungsvariable
$HOME
anstelle der Tilde, die in "doppelten Anführungszeichen" (aber nicht in "einfachen Anführungszeichen") erweitert wird:quelle
~'/...'
wird nicht funktionieren und ist nicht das, was diese Antwort hat.~/'...'
oder~/"..."
wird funktionieren.~/'path'
ist der Weg zu gehen.~'/...'
funktionieren? Der Schrägstrich ist kein Sonderzeichen, daher sollte er entweder innerhalb oder außerhalb der Anführungszeichen funktionieren.~ ist ein Sonderzeichen, das von der Shell als Basisverzeichnis des angemeldeten Benutzers interpretiert wird. '~' wird von der Shell als Literalzeichen interpretiert, nicht als Home-Verzeichnis des angemeldeten Benutzers, da das Einschließen einer Zeichenfolge in zwei einfache Anführungszeichen dazu führt, dass diese Zeichenfolge als Literaltextzeichenfolge interpretiert wird.
quelle
~
ist kein Alias in dem Sinnebash
, dass es interpretiert wird: Aliase ermöglichen das Ersetzen eines Wortes durch eine Zeichenfolge, wenn es als erstes Wort eines einfachen Befehls verwendet wird. . Wie ich in meiner Antwort unten erläutere, handelt es sich eher um eine Erweiterung.Dies ist eine
bash
Funktion namens Tilde-Erweiterung . Zitierenman bash
:Damit die Erweiterung funktioniert, muss das Tilde-Zeichen
~
nicht in Anführungszeichen gesetzt sein. Andernfalls wird das Zeichen wörtlich genommen undcd
schlägt fehl, wenn~
im aktuellen Verzeichnis kein Verzeichnis mit dem Namen vorhanden ist. Siehe diese ausführliche Antwort für eine Erklärung des Zitierens inbash
. Wenn Sie einen Teil des Pfades angeben müssen, können Sie daher:Zitieren Sie mindestens die Zeichen, die in einfache Anführungszeichen gesetzt werden müssen, z
oder
Zitieren Sie mindestens die Zeichen, die in Anführungszeichen gesetzt werden müssen, z
oder
Zitieren Sie nur die Zeichen, die mit Backslashes zitiert werden müssen, z
Tilde Expansion hat einige weitere interessante Funktionen, zB:
~+
Erweitert auf den Wert vonPWD
, dh das aktuelle Arbeitsverzeichnis~-
Erweitert auf den Wert vonOLDPWD
, dh das vorherige Arbeitsverzeichnis~john
Erweitert das Ausgangsverzeichnis, das mit dem Anmeldenamen "john" verknüpft ist.quelle
$ touch a; cd \a
. (Ich dachte, dies könnte in Schwierigkeiten geratencd \n
, aber das Experimentieren zumindest mit meiner Versionbash
deutet darauf hin, dass es gut funktioniert.)Erkunden mit
echo
BefehlMit dem
echo
Befehl können Sie am einfachsten untersuchen, wie die Dinge in bash funktionieren . Im Falle der~
Verwendung dieses:Wie Sie sehen, wird ein einfaches Anführungszeichen oder doppelte Anführungszeichen
~
als Zeichenfolge interpretiert und nicht als Variable erweitert. Wenn Sie Backticks (`) verwenden, wird es als Befehl ausgeführt und generiert eine Fehlermeldung.quelle