Bash script per cd nella directory con spazi nel percorso


96

Sto usando Bash su macOS X e mi piacerebbe creare un semplice file di script eseguibile che cambierebbe in un'altra directory quando viene eseguito. Tuttavia, il percorso di quella directory contiene spazi. Come diavolo fai a farlo? Questo è quello che ho ...

Nome del file: cdcode

Contenuto del file:

cd ~/My Code

Ora garantito, questo non è un percorso lungo, ma il mio percorso effettivo è profondo cinque directory e quattro di queste directory hanno spazi nel percorso.

BTW, ho provato cd "~/My Code"ed cd "~/My\ Code"e nessuno di questi ha funzionato.


1
Sto riscontrando un problema simile a quello descritto. Cioè nessuno dei modi possibili per passare a una directory che contiene uno spazio. Niente come: cd "My Passport" cd My \ Passport cd My "Passport" niente funziona. La complition funziona bene. Posso elencare: ls -l My \ Passport / funziona bene. \> uname -a host Linux 2.6.18-8.1.8.el5.centos.plus # 1 SMP lunedì 16 luglio 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, versione 3.1 .17 (1) -release- (i686-redhat-linux-gnu) qualche idea per favore?
Denis C

Risposte:


81

Quando si virgolette due volte un percorso, si ferma l'espansione della tilde. Quindi ci sono alcuni modi per farlo:

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

La tilde non è citata qui, quindi l'espansione della tilde verrà comunque eseguita.

cd "$HOME/My Code"

È possibile espandere le variabili di ambiente all'interno di stringhe tra virgolette; questo è fondamentalmente ciò che sta facendo l'espansione della tilde

cd ~/My\ Code

Puoi anche eseguire l'escape di caratteri speciali (come lo spazio) con una barra rovesciata.


3
Potresti anche cd ~ / My '' Code, ma sarebbe sciocco quando puoi scappare con un backslash invece
Nick Dixon

41

Ho trovato la soluzione qui sotto in questa pagina :

x="test\ me"  
eval cd $x

Una combinazione di \una costante di testo tra virgolette e una evalprima lo cdfa funzionare come un fascino!


maggiore chiarezza: per accedere alla directory di un file di uno script: DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert

1
Questo mi ha davvero aiutato a eseguire uno script bash su una macchina OS X. 🎉
timbillstrom

Non c'è davvero bisogno di evalqui.
Benjamin W.

2
Su OS X, non riuscivo a far funzionare le altre / precedenti risposte senza eval.
D. Woods

10
cd ~/My\ Code

sembra funzionare per me ... Se eliminare le virgolette ma mantenere la barra non funziona, puoi pubblicare del codice di esempio?


10

Puoi usare uno qualsiasi di:

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

Non puoi usare:

cd ~"/My Code"

Il primo funziona perché la shell si espande ~ / in $ HOME /, quindi inserisce My Code senza virgolette doppie. Il secondo fallisce perché non c'è un utente chiamato ' "' (virgolette doppie) su cui ~"mappare.


9

Dopo aver lottato con lo stesso problema, ho provato due diverse soluzioni che funzionano:

1. Usa le virgolette doppie ( "") con le tue variabili.

Il modo più semplice tra virgolette doppie le tue variabili come indicato nella risposta precedente:

cd "$yourPathWithBlankSpace"

2. Utilizza eval.

Secondo questa risposta, il comando Unix per sfuggire agli spazi è possibile rimuovere lo spazio vuoto quindi utilizzarlo eval, in questo modo:

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

4

Una singola barra rovesciata funziona per me:

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

Sei sicuro che il problema non sia che il tuo script di shell stia cambiando directory nella sua subshell, ma poi sei tornato nella shell principale (e nella directory originale) quando hai finito? L'ho evitato usando. per eseguire lo script nella shell corrente, anche se la maggior parte delle persone userebbe semplicemente un alias per questo. Gli spazi potrebbero essere una falsa pista.


Grazie, Ry4an (e il resto degli intervistati). Sembra che stavo eseguendo lo script in modo errato. Stavo solo cercando di eseguirlo in questo modo:% ./cdsomedir Non mi rendevo conto di dover usare il "." per eseguire lo script come hai fatto:%. cdsomedir.sh Dopo averlo fatto, ha funzionato. Errore principiante. Grazie!


2

Quando si lavora sotto Linux, la sintassi seguente è corretta:

cd ~/My\ Code

Tuttavia, quando esegui il file, utilizza la sintassi seguente:

$ . cdcode

(solo "." e non "./")


Per folle curiosità, perché è importante? Ho visto solo "./" usato.
whaley

./ genererà una nuova shell e quindi cambierà la directory. Quindi quando lo script esce, torna alla shell che ha generato la nuova shell ... ti troverai nella directory in cui hai eseguito lo script invece di ~ / My Code. "." d'altra parte fa sì che lo script venga eseguito nell'istanza corrente della shell.
Alterlife

Il punto "." è un comando unix, un alias per il comando "source". Dovrebbe essere seguito da un nome di file. Quindi "source myfile" eseguirà il file all'interno della shell corrente. E ". Myfile" farà lo stesso. La variabile "./" significa "directory corrente" e non è un comando.
JPGConnolly

2

usa le virgolette doppie

go () 
{ 
    cd "$*"
}

Grazie. Un'utile aggiunta alle funzioni in un .bashrcfile per cambiare directory quando si incollano nomi di directory contenenti spazi sulla riga di comando senza dover quindi sfuggire agli spazi o citare il tutto. cdsè un nome migliore però.
sabato

C'è un modo per estendere questo (senza un if) in modo tale che gosia equivalente a cd, cioè, cd alla directory home?
zennehoy

2

Il modo molto semplice per farlo è:

 $ cd My\ Folder

In bash, esegui il comando DIR e nei risultati vedrai che i nomi delle cartelle o dei percorsi con spazio tra di loro sono stati scritti nei risultati in questo modo:

$dir
My\ Folder
New\ Folder

2

Questo lo farà:

cd ~/My\ Code

Ho dovuto usarlo per lavorare con i file archiviati in iCloud Drive. Non vorrai usare le virgolette doppie (") in quanto deve essere un percorso assoluto. In altre parole, non puoi combinare le virgolette doppie con la tilde (~).

A titolo di esempio ho dovuto usarlo per un progetto recente:

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

Spero che aiuti.


1

Ho avuto un problema simile ora, stavo usando uno script bash per scaricare alcuni dati. Ho finito per creare un collegamento simbolico nella cartella dello script senza spazi. Ho quindi indicato il mio script al collegamento simbolico e funziona bene.

Per creare il tuo collegamento. ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]

Mau o potrebbe non essere utile.


0

Usa virgolette singole, come:

myPath=~/'my dir'

cd $myPath
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.