Wie geben Sie ein Verzeichnis ein, dessen Name nur ein Minus ist?

26

Ich habe lessn auf meinen Webserver heruntergeladen und entpackt.

Es enthält einen Ordner mit dem Namen -. Ich nahm an, dass ich damit umgehen kann, aber ich weiß es nicht.

Ich habe es versucht cd -- -, aber das hat nicht den gewünschten Effekt. Die Verwendung von Anführungszeichen scheint dies ebenfalls nicht zu beeinträchtigen. Ich habe überall Schrägstriche angebracht, ohne Erfolg.

Was ist der richtige Weg, um in diesen Ordner zu wechseln?

Der Hochstapler
quelle

Antworten:

34

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 rmcdman bashman cdcd-man bashman cd

Es sollte auch beachtet werden, dass cdes sich um eine eingebaute Shell-Funktion handelt, wie in dieser Antwort zu lesen ist :

cdist 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 cdBefehl, 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 whichund 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 whichfür weitere Informationen und man bashoder man typefürtype

Tamara Wijsman
quelle
4
Nein, "-" ist in allen Standarddienstprogrammen implementiert, soll jedoch Optionen beenden. "-" allein wird nicht als Option, sondern als vorheriges Verzeichnis erkannt.
Stéphane Chazelas
4
Richtige Lösung, aber die Erklärung ist falsch. Es ist völlig irrelevant, dass cdes sich um ein eingebautes Gerät handelt. Der Grund, warum cd -- -dies nicht funktioniert, ist, dass -es sich um einen Operanden handelt und nicht um eine Option.
Gilles 'SO- hör auf böse zu sein'
1
Unter Mac OS X cd -- -wechseln Sie in ein Verzeichnis mit dem Namen -des aktuellen Verzeichnisses. FWIW.
Tim Kennedy
Die meisten Kommentare fanden sich im zweiten Teil meines Beitrags wieder.
Tamara Wijsman
22

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 in cd -und immer noch ein Operand in cd -- -. cdBehandelt einen Operanden wie andere Standarddienstprogramme als einen Operanden, unabhängig davon, ob sich --davor ein Operand befindet .

Der cdBefehl weist dem Operanden eine besondere Bedeutung zu -. Alles andere ist ein Verzeichnis, in das man wechseln kann. cd -- -awechselt in das aufgerufene Verzeichnis -a, da dies -akein spezieller Operand ist und --verhindert cd, 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: CDPATHWird nicht abgefragt, wenn der Verzeichnisname mit /, ./oder beginnt ../. Somit:

cd ./-

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:

cd -- -/

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ür cd -/(zsh tut es).

Gilles 'SO - hör auf böse zu sein'
quelle
Das hat mich umgehauen, ich habe es tatsächlich versucht cd -- -/, aber da ich das Äquivalent dazu ausgeführt cd -habe, existierte das Verzeichnis tatsächlich nicht und ich interpretierte es als einen weiteren fehlgeschlagenen Versuch.
Der Hochstapler
5

Die Qualifikation mit dem Pfad ist eine Option.

cd ./-
iruvar
quelle
2

Diese würden auch funktionieren:

cd ~/'-'

oder

cd ~/"-"
Michael Durrant
quelle
1
aber nur, wenn es im Home-Verzeichnis passiert
RIAD
1
… Und die Anführungszeichen sind unnötig.
Scott