Sie möchten vermeiden, dass es sich um einen Parameter handelt, daher versuchen wir, ihm etwas voran zu stellen. Auf das aktuelle Verzeichnis kann mit zugegriffen werden .
, der Unterordner -
kann also alternativ mit aufgerufen werden ./-
.
cd ./-
Der Grund, cd -- -
der nicht funktioniert, ist, dass dies anders implementiert wird, wenn Sie mit (sehen oder ) vergleichen rm
(sehen ), eine andere Interpretation haben, die als Parameter (sehen oder ) sieht .man rm
cd
man bash
man cd
cd
-
man bash
man cd
Es sollte auch beachtet werden, dass cd
es sich um eine eingebaute Shell-Funktion handelt, wie in dieser Antwort zu lesen ist :
cd
ist kein externer Befehl - es ist eine in die Shell eingebaute Funktion. Es wird im Kontext der aktuellen Shell ausgeführt und nicht wie externe Befehle in einem Fork / Exec-Kontext als separater Prozess.
Es gibt einen externen cd
Befehl, der jedoch etwas völlig anderes ausführt .
Dies erklärt, warum die Implementierung unterschiedlich ist, da Bash und Coreutils zwei verschiedene Dinge sind.
Nehmen wir nur an, Sie würden das nicht glauben. Wie bestätigen wir das? Verwenden Sie which
und type
.
$ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
$ which rm && type rm
/bin/rm
/bin/rm is /bin/rm
Sehen Sie man which
für weitere Informationen und man bash
oder man type
fürtype
cd
es sich um ein eingebautes Gerät handelt. Der Grund, warumcd -- -
dies nicht funktioniert, ist, dass-
es sich um einen Operanden handelt und nicht um eine Option.cd -- -
wechseln Sie in ein Verzeichnis mit dem Namen-
des aktuellen Verzeichnisses. FWIW.Ein Minus (auch als Bindestrich bezeichnet) allein ist keine Option, sondern ein Operand (dh ein Argument, das keine Option ist). Aus diesem Grund hat das Voranstellen
--
keine Wirkung. Der Bindestrich ist ein Operand incd -
und immer noch ein Operand incd -- -
.cd
Behandelt einen Operanden wie andere Standarddienstprogramme als einen Operanden, unabhängig davon, ob sich--
davor ein Operand befindet .Der
cd
Befehl weist dem Operanden eine besondere Bedeutung zu-
. Alles andere ist ein Verzeichnis, in das man wechseln kann.cd -- -a
wechselt in das aufgerufene Verzeichnis-a
, da dies-a
kein spezieller Operand ist und--
verhindertcd
, dass es als Option behandelt wird. Dies funktioniert nicht-
alleine, was keine Option ist.Das Umstellen von Anführungszeichen
-
hilft nicht weiter, da dies letztendlich den Operanden-
ohnehin übergehen würde.Sie müssen daher nur einen anderen Weg finden, um dieselbe Idee auszudrücken, dh einen anderen Namen für dasselbe Verzeichnis. Glücklicherweise gibt es eine einfache
./
Möglichkeit : Wenn Sie vor einem relativen Dateinamen einen Dateinamen hinzufügen , bedeutet dies immer noch, dasselbe File. Das./
macht einen Unterschied, der in unserem Fall irrelevant ist:CDPATH
Wird nicht abgefragt, wenn der Verzeichnisname mit/
,./
oder beginnt../
. Somit:Eine andere Möglichkeit, da
-
es sich um ein Verzeichnis handelt, besteht darin, ein/
dahinterstehendes hinzuzufügen . Durch/
das Hinzufügen von am Ende eines Dateinamens wird sichergestellt, dass die Datei als Verzeichnis behandelt wird (insbesondere wird der Befehl auf das Verzeichnis selbst und nicht auf den Symlink angewendet, wenn es sich bei der Datei um einen symbolischen Link zu einem Verzeichnis handelt), andernfalls jedoch ausgeführt kein Unterschied. Somit:Das Schreiben
-/
wird übrigens durch den Completion-Code vorgeschlagen, aber in der Bash funktioniert es nur,--
bevor es ausgeführt wird. Die Bash hat keinen speziellen Fall fürcd -/
(zsh tut es).quelle
cd -- -/
, aber da ich das Äquivalent dazu ausgeführtcd -
habe, existierte das Verzeichnis tatsächlich nicht und ich interpretierte es als einen weiteren fehlgeschlagenen Versuch.Die Qualifikation mit dem Pfad ist eine Option.
quelle
Diese würden auch funktionieren:
oder
quelle