/: ist ein Verzeichnisproblem in bash

Ich bin ziemlich neu in Bash-Skripten und habe einigermaßen gute Ergebnisse erzielt, bin aber auf ein Problem gestoßen.

Ich versuche, ein Skript zu erstellen, das einen Schrägstrich (/) verwendet. Es wird jedoch immer wieder die Fehlermeldung /: is a directory.

angezeigt Ich muss den Befehl test/(hello) an ein Programm im Terminal übergeben. Daher habe ich Backslashes hinzugefügt, damit es funktioniert: test\/\(hello\) Ich erhalte diesen Fehler. Was ist hier falsch?

Kommentare

  • wo verwendet das Skript den Schrägstrich? Es hört sich so an, als ob Sie das Argument erfolgreich an den Befehl / das Skript übergeben, aber dass das Skript einen Fehler enthält. Können Sie uns ein detaillierteres Beispiel geben? Erwähnt ' nicht eine Zeilennummer oder etwas anderes?

Antwort

Dies sollte nur passieren, wenn Sie a nicht bestehen Befehl vor dem Argument. Sie müssen Befehle wie folgt aufrufen:

command [args ...] 

Wenn Sie es so aufrufen, funktioniert es.

$ echo test/\(hello\) test/(hello) 

Für den Datensatz ist es im Allgemeinen viel einfacher (und viel lesbarer), Argumente zu zitieren, anstatt alle Metazeichen zu maskieren. Sie können dies mit " und tun " (es gibt gute Informationen zu diesem hier ).

Kommentare

  • Upvoted. Die Shell interpretiert Text, der nur durch Schrägstriche getrennt ist, als Verzeichnisse und nicht als Befehle / Argumente. Der Schrägstrich kann in Argumenten von beispielsweise Perl-Skripten verwendet werden (erfordert die Konfiguration von Getopt::Long oder das Rollen Ihrer eigenen), erfordert jedoch weiterhin den Abstand zwischen dem Befehl und den Argumenten. Dies ist eine Shell-Anforderung.

Antwort

Wenn Sie die genaue Zeichenfolge übergeben müssen test/(hello) in ein Programm setzen Sie es in einfache Anführungszeichen:

someprogram "test/(hello)" 

Jedes Zeichen wird buchstäblich zwischen einfachen Anführungszeichen interpretiert, mit Ausnahme des einfachen Anführungszeichens selbst. Wenn Sie ein einfaches Anführungszeichen in der Zeichenfolge benötigen, übergeben Sie es als "\"" (Literalzeichenfolge beenden, nächstes Zeichen in Anführungszeichen setzen, einfaches Anführungszeichen wörtlich interpretieren, Literalzeichenfolge starten).

echo "Lasciate ogne speranza, voi ch"\""entrate" 

Dies hat nichts mit der hier angezeigten Fehlermeldung zu tun. /: is a directory bedeutet, dass Sie versucht haben, / als Programm auszuführen. Es gibt vermutlich eine Stelle, an der Sie versucht haben, den vollständigen Pfad zu einem Programm zu schreiben, aber einen zusätzlichen Platz gelassen haben, wie in

/ path/to/program 

Möglicherweise werden andere Satzzeichen erstellt Dies ist weniger offensichtlich, oder Steuerzeichen in dieser Nachricht. Um das Debuggen zu erleichtern, setzen Sie set -x in die zweite Zeile des Skripts direkt nach der ersten Zeile #!, damit die Shell a druckt Trace jeder ausgeführten Zeile.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.