Es kann nicht in ein Verzeichnis mit Leerzeichen im Namen geschrieben werden, selbst wenn Anführungszeichen oder Escapezeichen verwendet werden

722
Kurt Peek

In einer Bash-Shell auf einem MacOS-Computer kann ich durch Eingabe lseines Regisseurs erkennen Application Support:

$ ls Accounts FontCollections PreferencePanes Application Scripts Fonts Preferences Application Support GameKit Printers Assistant Google PubSub Assistants Group Containers Safari Audio IdentityServices SafariSafeBrowsing Caches Input Methods Saved Application State Calendars Internet Plug-Ins Screen Savers CallServices Keyboard Services ColorPickers Keyboard Layouts Sharing Colors KeyboardServices Sounds Compositions Keychains Spelling Containers LanguageModeling Suggestions Cookies LaunchAgents SyncedPreferences CoreFollowUp Library VirtualBox Developer Logs Voices Dictionaries Mail WebKit F5Networks Messages com.apple.internal.ck Family Metadata iMovie Favorites Mobile Documents FileProvider Passes 

Wenn ich jedoch versuche, cdin dieses Verzeichnis mit Anführungszeichen oder Escape-Zeichen zu wechseln, wie in Wie beschrieben, cd in ein Verzeichnis beschrieben, das ein Leerzeichen im Namen enthält? Ich bekomme immer noch einen Fehler:

LM-SJN-21018636:Library kupeek$ cd "Application Support" -bash: cd: Application: No such file or directory LM-SJN-21018636:Library kupeek$ cd Application\ Support -bash: cd: Application: No such file or directory 

Es scheint, als würde bash die Anführungszeichen oder Escape-Zeichen nicht aufheben und stattdessen nach einem Verzeichnis mit dem Namen "Application" suchen. Irgendwelche Ideen, warum das nicht funktioniert?

0
Vielleicht haben Sie einen Alias ​​oder ähnliches für `cd`, der schlecht geschrieben wurde. Was druckt `command -v cd`? meuh vor 5 Jahren 2
Ich würde eine schlecht geschriebene Funktion vermuten. Und ich denke, "command -v cd" aus dem ersten Kommentar sollte "command -V cd" (Großbuchstabe V) sein. `type -a cd` sollte auch funktionieren. Kamil Maciorowski vor 5 Jahren 2
Was passiert, wenn Sie es mit der Tab-Taste "automatisch füllen"? Gleicher Fehler? Aulis Ronkainen vor 5 Jahren 1

5 Antworten auf die Frage

5
Kamil Maciorowski

Sie cdkönnen eine schlecht definierte Funktion oder ein Alias ​​sein. Lauf type -a cdum es herauszufinden.

Ein möglicher Alias ​​wird in dieser anderen Antwort erläutert . Meine Antwort konzentriert sich auf Shell-Funktionen.

Zum Beispiel, wenn die Funktion verwendet wird

  • command cd $*( commandBuiltin erklärt hier ) oder
  • command cd $@ oder
  • command cd $1

anstatt richtig

  • command cd "$@" oder
  • command cd "$1" (nicht so gut wie oben, immer noch nicht tödlich)

Wenn Ihr Bash nicht geworfen hat too many arguments(Version vor 4.4, siehe diese Frage ), würde das Verhalten genau so sein, wie Sie es beschrieben haben, da Application Supportein einzelnes Argument für die Funktion eine Wortaufspaltung innerhalb der Funktion selbst durchlaufen würde, also command cddas Applicationerste Argument .

Ist Ihre cdFunktion in der Tat eine schlecht definierte Funktion, sollten Sie den Ort, an dem sie definiert ist, nachverfolgen und beheben. Eine Ad-hoc- Lösung wäre, das commandWort cdwie folgt hinzuzufügen :

command cd "Application Support" 

oder

command cd Application\ Support 

(Dies funktioniert auch, wenn Alias ​​der Täter ist).

1
GiopperOne

Verwenden Sie mehrere Anführungszeichen,

zB den Namen in Anführungszeichen in Anführungszeichen setzen:

cd "'Application Support'" 

"Ein in Anführungszeichen eingeschlossenes Argument stellt sich selbst als Einzelwort dar, selbst wenn es Leerzeichen-Trennzeichen enthält." Erweitertes Bash-Scripting-Handbuch

Die Verwendung von zwei Anführungszeichen (Anführungszeichen innerhalb von Anführungszeichen) ist eine praktikable Problemumgehung, vorausgesetzt, das Problem besteht darin, dass der ursprüngliche cdBefehl als Alias ​​verwendet wurde. Die folgende definition

alias cd='eval command cd' 

würde das hier beschriebene Problem reproduzieren (in der Bash-Version vor 4.4 siehe diese Antwort ). Es kommt vor, dass evaldie Befehlszeile zum zweiten Mal analysiert wird, und beim ersten Durchlauf der Analyse wird eine Notierungsebene entfernt. Die Verwendung von zwei Anführungszeichengruppen funktioniert, weil evaldas Argument mit der zweiten Anführungszeichengruppe an das erste Argument übergeben wird cd.

Wenn ein solcher Alias ​​der Fall ist, ist es die beste Lösung, ihn zu beheben.

Einfach. Ich glaube, das Problem hier ist, dass der ursprüngliche Befehl "cd" als Alias ​​verwendet wurde. Der Alias ​​erhält die Pfadzeichenfolge als Argument und er erhält sie korrekt, wenn Sie die ersten Anführungszeichen setzen. Dann übergibt es es an "cd", aber es geht dort ohne Anführungszeichen und schlägt fehl. Wenn Sie zwei Sätze von Anführungszeichen setzen, erhält der Alias ​​den String mit dem ersten Satz und übergibt ihn dann mit dem zweiten Satz von Anführungszeichen an "cd" und ... Magic, es funktioniert! GiopperOne vor 5 Jahren 0
Vielen Dank für Ihren Vorschlag. Ich habe meine Antwort bearbeitet und eine Referenz hinzugefügt. Ich muss hier nicht erklären, wie man einen "cd" -Alias ​​ändert, das wäre ein Thema. Ich beantworte die Frage "Gibt es irgendwelche Ideen, warum das nicht funktioniert?" Setzen Sie es in Anführungszeichen und es wird funktionieren. GiopperOne vor 5 Jahren 0
Gut gemacht! Danke für Ihre Kooperation. Kamil Maciorowski vor 5 Jahren 0
0
Aganju

Möglicherweise gibt es mehr Leerzeichen oder andere nicht druckbare Zeichen, die Sie nicht sehen können. Versuch cd Application*Scrip*oder ähnliches.

Dies könnte in einem anderen Fall der Fall sein, in diesem Fall jedoch nicht. Beachten Sie, dass die Meldung `-bash: cd: Anwendung: Keine solche Datei oder ein solches Verzeichnis` ist, nicht `-bash: cd: Anwendungsunterstützung: Keine solche Datei oder ein solches Verzeichnis`. Der Befehl sieht nicht die gesamte Argumentzeichenfolge an erster Stelle. Kamil Maciorowski vor 5 Jahren 1
0
Xen2050

WENN Siecdkein sonderbarer Alias ​​sind, würde ich einfachTABmit bash Autocomplete (falls aktiviert) ein Arbeitsformat für Sie ausfüllen.

Tippen

cd ApTAB

sieht so aus, als müsste es sich so etwas automatisch füllen

cd Application\ S 

(Wenn Sie einen merkwürdigen CD-Alias ​​haben, sollte das Anhängen von Kamils ​​Antwort auf die Eingabe auch command cd A...mit TABs funktionieren.)

und warten Sie dann, bis Sie mehr des gewünschten Namens eingeben (gefolgt von einem anderen, TABum den Rest automatisch zu vervollständigen ). Wenn Sie nur TABein oder zwei Mal mehr eingeben, werden Ihre verfügbaren Optionen angezeigt.

(Ich würde auch nicht einfach verwenden ls, ls -laoder ls -1stattdessen nur einen Eintrag pro Zeile sehen, Ihre lsAusgabe ist nicht klar.)

Dies kann in einem allgemeinen Fall ein guter Rat sein (z. B. für zukünftige Benutzer mit ähnlichen Problemen), aber ich bezweifle, dass dies dem OP sofort helfen wird. Beachten Sie, dass die Meldung "Anwendung: Keine solche Datei oder Verzeichnis", nicht "Anwendungsunterstützung: Keine solche Datei oder Verzeichnis". Wenn der Verzeichnisname in der Befehlszeile einfach nicht mit dem tatsächlichen Namen übereinstimmt, stimmt "cd" trotzdem damit überein, dass das gesamte Argument falsch ist. Ich habe keine Antworten erhalten, die sich auf sehr ähnliche Probleme beziehen können. Dennoch stelle ich fest, dass sie nicht vollständig zum OP-Thema passen und nicht erklären können, worauf es ankommt. Kamil Maciorowski vor 5 Jahren 0
Das dachte ich auch, aber es ist ein wenig nervig, wenn der Titel nicht ganz dem tatsächlichen Problem entspricht ("* My` cd "ist defekt *) und der Tab complete nur in einem Kommentar kurz erwähnt wurde das "Titelproblem" schien angemessen. Xen2050 vor 5 Jahren 0
-1
Biku Balami

Es liegt daran, dass Sie bei einem Wort fehlen. Versuchen Sie es mit:

cd "Application Support GameKit" 
Ich wiederhole mich: Dies könnte es in einem anderen Fall sein, aber nicht in diesem speziellen Fall. Beachten Sie, dass die Meldung `-bash: cd: Anwendung: Keine solche Datei oder ein solches Verzeichnis` ist, nicht `-bash: cd: Anwendungsunterstützung: Keine solche Datei oder ein solches Verzeichnis`. Der Befehl sieht nicht die gesamte Argumentzeichenfolge an erster Stelle. Kamil Maciorowski vor 5 Jahren 0
Sie haben das OP falsch gelesen. Sie sind 2 verschiedene Spalten Tetsujin vor 5 Jahren 0