2009-02-26 11 views
71

Argggg. Ich habe tagelang mit diesem dummen Problem gekämpft und kann keine Antwort finden.BASH Skript zum cd zu Verzeichnis mit Leerzeichen im Pfadnamen

Ich verwende BASH unter Mac OS X und ich möchte eine einfache ausführbare Skriptdatei erstellen, die bei der Ausführung in ein anderes Verzeichnis wechseln würde. Der Pfad zu diesem Verzeichnis enthält jedoch Leerzeichen. Wie zum Teufel machst du das? Das ist, was ich habe ...

Name der Datei: cdcode

Inhalt der Datei: cd ~/My Code

Zugegeben, dies ist nicht ein langer Pfad, aber mein eigentlicher Pfad ist fünf Verzeichnisse tief und vier dieser Verzeichnisse haben Leerzeichen im Pfad.

BTW, ich habe versucht cd "~/My Code" und cd "~/My\ Code" und keiner von diesen funktioniert.

+1

Ich habe ein ähnliches Problem wie das beschriebene. I.e. keine der möglichen Möglichkeiten, in ein Verzeichnis zu wechseln, in dem ein Leerzeichen enthalten ist. Nichts wie: cd "My Passport" cd My \ Passport cd My "Passport" nichts funktioniert. Die Complition funktioniert gut. Ich kann auflisten: ls -l Mein \ Passport/ funktioniert gut. \> uname -a Linux-Host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Mo Jul 16 08:49:50 EDT 2007 i686 i686 i386 GNU/Linux \> bash --hilfe GNU bash, version 3.1.17 (1) -release- (i686-redhat-linux-gnu) irgendwelche Ideen bitte? –

Antwort

6
cd ~/My\ Code 

scheint für mich zu arbeiten ... Wenn Sie die Anführungszeichen löschen, aber den Schrägstrich nicht funktioniert, können Sie einige Beispielcode posten?

4

Ein einzelner Schrägstrich für mich funktioniert:

[email protected]:~$ mkdir "My Code" 

[email protected]:~$ vi todir.sh 

[email protected]:~$ . todir.sh 

[email protected]:My Code$ cat ../todir.sh 
#!/bin/sh 
cd ~/My\ Code 

Sind Sie sicher, dass das Problem ist nicht, dass Ihre Shell-Skript-Verzeichnis in seiner Subshell verändert sich, aber dann bist du wieder in der Hauptschale (und original dir) wenn fertig? Ich habe das vermieden, indem ich benutzt habe. um das Skript in der aktuellen Shell auszuführen, obwohl die meisten Leute nur einen Alias ​​dafür verwenden würden. Die Räume könnten ein Ablenkungsmanöver sein.

+0

Danke, Ry4an (und der Rest der Befragten). Es scheint, dass ich das Skript falsch ausgeführt habe. Ich habe nur versucht, es so auszuführen: % ./cdsomedir Ich wusste nicht, dass ich das "." um das Skript wie gewohnt auszuführen: %. cdsomedir.sh Sobald ich das getan habe, hat es funktioniert. Anfänger Fehler. Vielen Dank! –

2

Wenn unter Linux arbeiten die Syntax ist unten rechts:

cd ~/My\ Code

Allerdings, wenn Sie Ihre Datei sind ausgeführt wird, unter die Syntax:

$ . cdcode

(nur‘. 'und nicht' ./ ')

+0

Aus wilder Neugier, warum ist das wichtig? Ich habe nur './' benutzt. – whaley

+0

./ erstellt eine neue Shell und ändert dann das Verzeichnis. Wenn das Skript beendet wird, kehrt es zu der Shell zurück, die die neue Shell erzeugt hat ... Sie befinden sich in dem Verzeichnis, in dem Sie das Skript ausgeführt haben, anstatt ~/My Code. '.' bewirkt andererseits, dass das Skript in der aktuellen Instanz der Shell ausgeführt wird. – Alterlife

+0

Der Punkt "." ist ein Unix-Befehl, ein Alias ​​für den Befehl "source". Es sollte ein Dateiname folgen. So "Quelle Myfile" wird die Datei in Ihrer aktuellen Shell ausführen. Und ". Myfile" wird das gleiche tun. Die Variable "./" bedeutet "aktuelles Verzeichnis" und ist kein Befehl. – JPGConnolly

7

Sie können einen der folgenden Werte verwenden:

cd ~/"My Code" 
cd ~/M"y Code" 
cd ~/My" Code" 

Sie können nicht verwenden:

cd ~"/My Code" 

Die ersten Arbeiten, da die Shell ~/in $ HOME/erweitert, und dann Angriffe auf My-Code ohne die doppelten Anführungszeichen. Der zweite Fehler tritt auf, weil kein Benutzer namens '"' (double quote) für ~" zugeordnet ist.

67

Wenn Sie einen Pfad doppelt angeben, wird die Tilde-Erweiterung gestoppt. So gibt es ein paar Möglichkeiten, dies zu tun:

cd ~/"My Code" 
cd ~/'My Code' 

Die Tilde hier nicht zitiert wird, so Tilde-Erweiterung wird noch ausgeführt werden.

cd "$HOME/My Code" 

Sie können Umgebungsvariablen in Strings mit doppelten Anführungszeichen erweitern; das ist im Grunde, was die Tilde-Erweiterung

cd ~/My\ Code 

Sie können auch Sonderzeichen (wie Leerzeichen) entkommen mit einem Backslash tut.

+2

Sie könnten sogar ~/My '' Code cd, aber das wäre albern, wenn Sie es mit einem Backslash stattdessen entkommen können –

1

Ich hatte ein ähnliches Problem jetzt, wo ich ein Bash-Skript verwendet, um einige Daten zu dumpen. Am Ende habe ich einen symbolischen Link im Skriptordner erstellt, in dem keine Leerzeichen enthalten sind. Ich zeigte dann mein Skript auf den symbolischen Link und das funktioniert gut.

Um Ihren Link zu erstellen. ln -s [ZIELVERZEICHNIS ODER -DATEI] ./[SHORTCUT]

Mau oder kann nicht von Nutzen sein.

1

Verwendung doppelte Anführungszeichen

go() 
{ 
    cd "$*" 
} 
+0

Danke. Eine nützliche Ergänzung zu den Funktionen in einer '.bashrc'-Datei zum Ändern des Verzeichnisses beim Einfügen von Verzeichnisnamen, die Leerzeichen enthalten, in die Befehlszeile, ohne dass die Leerzeichen dann entfernt oder das Ganze zitiert werden müssen. 'cds' ist jedoch ein besserer Name. – mattst

+0

Gibt es eine Möglichkeit, dies (ohne ein if) so zu erweitern, dass nur "go" gleich "cd" ist, d. H. Cd zum Home-Verzeichnis? – zennehoy

1

vermeiden ~ in Skripten; Verwenden Sie stattdessen $ HOME.

1

Die sehr einfache Art und Weise, dies zu tun ist-

$ cd My\ Folder 

In der bash Befehl ausführen DIR und in den Ergebnissen würden Sie sehen, dass wie in den Ergebnissen der Ordner oder Pfadnamen haben Raum zwischen ihnen geschrieben wurde dies -

$dir 
My\ Folder 
New\ Folder 
1

Nachdem mit dem gleichen Problem zu kämpfen, habe ich versucht, zwei verschiedene Lösungen, die funktionieren:

  • Solution1: Der einfachste Weg, nur doppelte Anführungszeichen Ihre Variablen wie in früheren Antwort darauf cd "$yourPathWithBlankSpace"
  • Solution2: Nach dieser Antwort Unix command to escape spaces Sie Leerzeichen Streifen kann dann Verwendung von Eval machen, wie folgt aus:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace") + eval cd $yourPathEscaped

Verwandte Themen