Wie entkomme ich einem Unterverzeichnisnamen mit einem kaufmännischen Und?

9

Ausführen einer Kornshell und Versuch, einen Verzeichnisbaum zu durchlaufen. Möchten Sie in ein Unterverzeichnis mit dem folgenden Namen cd:

 -3ab_&_-3dc.img

Meine Frage ist, wie ich dem kaufmännischen Und in diesem Namen entkommen muss. Ich habe verschiedene Kombinationen von doppelten Anführungszeichen und Backslashes ohne Erfolg ausprobiert.

RCinICT
quelle

Antworten:

11

Für den &(oder fast jeden anderen Charakter) haben Sie zwei einfache Möglichkeiten.

  • Setzen Sie einfache Anführungszeichen um das Ganze: ' -3ab_&_-3dc.img'
  • Setzen Sie vor jedem lästigen Charakter einen Backslash: -3ab_\&_-3dc.img

Es gibt zwei Ausnahmen:

  • Die einfache Anführungszeichenmethode funktioniert nicht für ein einfaches Anführungszeichen. Backslash ist in einfachen Anführungszeichen nichts Besonderes, daher können Sie es auch nicht direkt verwenden. Sie können die Zeichenfolge in einfachen Anführungszeichen beenden, sofort Backslash plus einfache Anführungszeichen verwenden und die einfache Anführungszeichen neu starten. Zum Beispiel, wenn der Name des Verzeichnisses lautet foo'bar\qux: cd 'foo'\''bar\qux'. Sie können sich so daran erinnern: In einfachen Anführungszeichen erhalten '\''Sie ein einfaches Anführungszeichen.
  • Die Backslash-Methode funktioniert nicht für Zeilenumbrüche: Backslash-Zeilenumbrüche werden einfach ignoriert. Sie müssen einfache Anführungszeichen um eine neue Zeile setzen.

Sie können auch doppelte Anführungszeichen verwenden, aber dann müssen Sie vor einigen Zeichen einen Backslash setzen. Einfache Anführungszeichen sind einfacher.

Es gibt hier eine zusätzliche Schwierigkeit, nämlich dass der Name des Verzeichnisses mit einem Bindestrich beginnt. Dieses Zeichen teilt dem cdBefehl (wie fast jedem Befehl) mit, dass eine Option folgt. Der Bindestrich ist nicht speziell für die Shell, sondern nur für den Befehl, sodass Anführungszeichen keinen Einfluss darauf haben. Sie haben zwei Möglichkeiten, ein Argument, das mit einem Bindestrich beginnt, an einen Befehl zu übergeben, ohne ihn als Option interpretieren zu lassen:

  • Finden Sie einen anderen Weg, um dieses Argument auszudrücken. Bei einem Dateinamen bedeutet das Hinzufügen ./im Vordergrund immer noch dieselbe Datei.
  • Stellen Sie das Argument --vor. Das weist den Befehl an, nicht mehr nach Optionen zu suchen.

Hier sind einige Möglichkeiten, wie Sie in dieses Unterverzeichnis wechseln können:

cd -- '-3ab_&_-3dc.img'
cd -- -3ab_\&_-3dc.img
cd ./-3ab_\&_-3dc.img
cd './-3ab_&_-3dc.img'
Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank. Ich dachte, ich hätte auch dieses Format ausprobiert, aber ich habe vergessen, dem kaufmännischen Und zu entkommen (wie in Ihrem dritten Beispiel). Als ich das tat, hat es funktioniert.
RCinICT
5

Das kaufmännische Und muss maskiert werden, aber das Problem, das Sie haben, liegt wahrscheinlich eher am führenden -als am kaufmännischen Und. Die führende -CD dachte, dass Sie Optionen übergeben. Sie können dies umgehen, indem Sie Folgendes verwenden ./:

cd './-3ab_&_-3dc.img'
Jordanm
quelle
Das &ist definitiv ein Problem. Was das -betrifft, hängt es von der Schale ab. Zsh freut sich sehr cdüber ein Verzeichnis, das mit a beginnt -. Bash ist es jedoch nicht.
Patrick
Vielen Dank. Ich dachte, ich hätte auch dieses Format ausprobiert, aber ich habe vergessen, dem kaufmännischen Und zu entkommen. Als ich das tat, hat es funktioniert.
RCinICT