Bash-Skript zur CD in ein Verzeichnis mit Leerzeichen im Pfadnamen

91

Ich verwende Bash unter macOS X und möchte eine einfache ausführbare Skriptdatei erstellen, die beim Ausführen in ein anderes Verzeichnis geändert wird. Der Pfad zu diesem Verzeichnis enthält jedoch Leerzeichen. Wie zum Teufel machst du das? Das habe ich ...

Name der Datei: cdcode

Dateiinhalt:

cd ~/My Code

Zugegeben, dies ist kein langer Pfadname, aber mein tatsächlicher Pfadname ist fünf Verzeichnisse tief und vier dieser Verzeichnisse haben Leerzeichen im Pfad.

Übrigens, ich habe versucht , cd "~/My Code"und , cd "~/My\ Code"und keiner von ihnen arbeitete.

Benjamin W.
quelle
1
Ich habe ein ähnliches Problem wie das beschriebene. Dh keine der möglichen Möglichkeiten, in ein Verzeichnis zu wechseln, in dem sich ein Leerzeichen befindet. Nichts wie: CD "Mein Reisepass" CD Mein \ Reisepass CD Mein "Reisepass" nichts funktioniert. Die Ergänzung 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 16.07. 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, Version 3.1 .17 (1) -release- (i686-redhat-linux-gnu) irgendwelche Ideen bitte?
Denis C

Antworten:

81

Wenn Sie einen Pfad in doppelte Anführungszeichen setzen, stoppen Sie die Tilde-Erweiterung. Es gibt also einige Möglichkeiten, dies zu tun:

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

Die Tilde wird hier nicht angegeben, daher wird die Tilde-Erweiterung weiterhin ausgeführt.

cd "$HOME/My Code"

Sie können Umgebungsvariablen in Zeichenfolgen in doppelten Anführungszeichen erweitern. Dies ist im Grunde das, was die Tilde-Erweiterung tut

cd ~/My\ Code

Sie können Sonderzeichen (z. B. Leerzeichen) auch mit einem Backslash maskieren.

derobert
quelle
3
Sie könnten sogar cd ~ / My '' Code, aber das wäre dumm, wenn Sie ihm stattdessen mit einem Backslash entkommen könnten
Nick Dixon
40

Ich habe die Lösung unten auf dieser Seite gefunden :

x="test\ me"  
eval cd $x

Eine Kombination aus \einer doppelten Textkonstante und einem evalVorher cdmacht es wie ein Zauber!

user365757
quelle
Mehr Klarheit: Zum CD-Verzeichnis in das Verzeichnis einer Datei eines Skripts: DIR = $ (Verzeichnisname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert
1
Dies hat mir wirklich geholfen, ein Bash-Skript auf einem OS X-Computer auszuführen. 🎉
Timbillstrom
Hier besteht wirklich keine Notwendigkeit eval.
Benjamin W.
2
Unter OS X konnte ich die anderen / vorherigen Antworten nicht ohne funktionieren lassen eval.
D. Woods
10
cd ~/My\ Code

scheint für mich zu funktionieren ... Wenn das Löschen der Anführungszeichen, das Beibehalten des Schrägstrichs jedoch nicht funktioniert, können Sie einen Beispielcode veröffentlichen?

Andrew Flanagan
quelle
10

Sie können Folgendes verwenden:

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

Sie können nicht verwenden:

cd ~"/My Code"

Das erste funktioniert, weil die Shell ~ / in $ HOME / erweitert und dann My Code ohne doppelte Anführungszeichen angreift. Der zweite Fehler schlägt fehl, da kein Benutzer namens ' "' (doppeltes Anführungszeichen) ~"zum Zuordnen vorhanden ist.

Jonathan Leffler
quelle
8

Nachdem ich mit demselben Problem zu kämpfen hatte, versuchte ich zwei verschiedene Lösungen, die funktionieren:

1. Verwenden Sie doppelte Anführungszeichen ("" ) für Ihre Variablen.

Am einfachsten zitieren Sie Ihre Variablen einfach doppelt, wie in der vorherigen Antwort angegeben:

cd "$yourPathWithBlankSpace"

2. Nutzen Sie eval .

Entsprechend dieser Antwort können Sie mit dem Unix-Befehl Leerzeichen entfernen, indem Sie Leerzeichen entfernen und dann evalwie folgt verwenden:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
HanniBaL90
quelle
4

Ein einziger Backslash funktioniert für mich:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

Sind Sie sicher, dass das Problem nicht darin besteht, dass Ihr Shell-Skript das Verzeichnis in seiner Subshell ändert, aber wenn Sie fertig sind, befinden Sie sich wieder in der Haupt-Shell (und im ursprünglichen Verzeichnis)? Ich habe das vermieden, indem ich verwendet 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 roter Hering sein.

Ry4an Brase
quelle
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 "." So führen Sie das Skript wie folgt aus:%. cdsomedir.sh Sobald ich das getan habe, hat es funktioniert. Anfängerfehler. Vielen Dank!
3

Vermeiden Sie ~ in Skripten; Verwenden Sie stattdessen $ HOME.

Chris FA Johnson
quelle
2

Wenn Sie unter Linux arbeiten, ist die folgende Syntax richtig:

cd ~/My\ Code

Verwenden Sie jedoch beim Ausführen Ihrer Datei die folgende Syntax:

$ . cdcode

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

Alterlife
quelle
Warum ist das aus wilder Neugier wichtig? Ich habe bisher nur './' benutzt gesehen.
Whaley
./ erzeugt eine neue Shell und ändert dann das Verzeichnis. Wenn das Skript beendet wird, kehrt es zu der Shell zurück, aus der die neue Shell hervorgegangen ist. Sie befinden sich in dem Verzeichnis, in dem Sie das Skript ausgeführt haben, anstelle von ~ / My Code. '.' Auf der anderen Seite wird das Skript in der aktuellen Instanz der Shell ausgeführt.
Alterlife
Der Punkt "." ist ein Unix-Befehl, ein Alias ​​für den Befehl "source". Es sollte ein Dateiname folgen. "Source myfile" führt die Datei also in Ihrer aktuellen Shell aus. Und ". Myfile" wird das gleiche tun. Die Variable "./" bedeutet "aktuelles Verzeichnis" und ist kein Befehl.
JPGConnolly
2

Verwenden Sie doppelte Anführungszeichen

go () 
{ 
    cd "$*"
}
Bobo
quelle
Vielen Dank. Eine nützliche Ergänzung zu den Funktionen in einer .bashrcDatei zum Ändern des Verzeichnisses beim Einfügen von Verzeichnisnamen, die Leerzeichen enthalten, in die Befehlszeile, ohne dass Sie die Leerzeichen verlassen oder das Ganze zitieren müssen. cdsist ein besserer Name.
Mattst
Gibt es eine Möglichkeit , dies zu verlängern (ohne wenn) , so dass nur gogleichwertig sein wird cd, das heißt, cd zu Home - Verzeichnis?
Zennehoy
2

Der sehr einfache Weg, dies zu tun, ist:

 $ cd My\ Folder

Führen Sie in bash den Befehl DIR aus, und in den Ergebnissen sehen Sie, dass die Ordner- oder Pfadnamen, zwischen denen ein Leerzeichen steht, in den Ergebnissen wie folgt geschrieben wurden:

$dir
My\ Folder
New\ Folder
Mayukh Datta
quelle
1

Ich hatte jetzt ein ähnliches Problem, als ich ein Bash-Skript verwendete, um einige Daten zu sichern. Am Ende habe ich einen symbolischen Link im Skriptordner ohne Leerzeichen erstellt. Ich habe dann mein Skript auf den symbolischen Link gerichtet und das funktioniert gut.

So erstellen Sie Ihren Link. ln -s [ZIELVERZEICHNIS ODER DATEI] ./[SHORTCUT]

Mau oder möglicherweise nicht von Nutzen.


quelle
1

Dies wird es tun:

cd ~/My\ Code

Ich musste das verwenden, um mit Dateien zu arbeiten, die im iCloud Drive gespeichert sind. Sie möchten keine doppelten Anführungszeichen (") verwenden, da dies ein absoluter Pfad sein muss. Mit anderen Worten, Sie können doppelte Anführungszeichen nicht mit Tilde (~) kombinieren.

Als Beispiel musste ich dies für ein aktuelles Projekt verwenden:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

Ich hoffe das hilft.

Josh
quelle
0

Verwenden Sie einfache Anführungszeichen wie:

myPath=~/'my dir'

cd $myPath
Jadian
quelle