Bash script en cd al directorio con espacios en la ruta

96

Estoy usando Bash en macOS X y me gustaría crear un archivo de script ejecutable simple que cambiaría a otro directorio cuando se ejecuta. Sin embargo, la ruta a ese directorio tiene espacios. ¿Cómo diablos haces esto? Esto es lo que tengo...

Nombre del archivo: cdcode

Contenido del archivo:

cd ~/My Code

Ahora bien, este no es un nombre de ruta largo, pero mi nombre de ruta real tiene cinco directorios de profundidad y cuatro de esos directorios tienen espacios en la ruta.

Por cierto, lo he intentado cd "~/My Code"y cd "~/My\ Code"y ninguno de ellos funcionó.

Benjamin W.
fuente
1
Tengo un problema similar al descrito. Es decir, ninguna de las formas posibles de cambiar a un directorio que tiene un espacio. Nada como: cd "My Passport" cd My \ Passport cd Mi "Passport" nada funciona. El complemento funciona bien. Puedo enumerar: ls -l My \ Passport / funciona bien. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Lun 16 de julio 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, versión 3.1 .17 (1) -release- (i686-redhat-linux-gnu) ¿alguna idea, por favor?
Denis C

Respuestas:

81

Cuando cita dos veces una ruta, detiene la expansión de tilde. Entonces, hay algunas formas de hacer esto:

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

La tilde no se cita aquí, por lo que aún se ejecutará la expansión de tilde.

cd "$HOME/My Code"

Puede expandir las variables de entorno dentro de cadenas entre comillas dobles; esto es básicamente lo que está haciendo la expansión de tilde

cd ~/My\ Code

También puede escapar de los caracteres especiales (como el espacio) con una barra invertida.

derobert
fuente
3
Incluso podría cd ~ / My '' Code, pero sería una tontería cuando se puede escapar con una barra invertida en su lugar
Nick Dixon
41

Encontré la solución a continuación en esta página :

x="test\ me"  
eval cd $x

¡Una combinación de \una constante de texto entre comillas dobles y un evalantes cdhace que funcione como un encanto!

usuario365757
fuente
más claridad: Para acceder al directorio de un archivo de un script: DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert
1
Esto realmente me ayudó a ejecutar un script bash en una máquina OS X. 🎉
timbillstrom
Realmente no hay necesidad de evalaquí.
Benjamin W.
2
En OS X, no podía hacer funcionar las respuestas anteriores / anteriores eval.
D. Woods
10
cd ~/My\ Code

parece funcionar para mí ... Si soltar las comillas pero mantener la barra no funciona, ¿puede publicar algún código de muestra?

Andrew Flanagan
fuente
10

Puede utilizar cualquiera de:

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

No se puede usar:

cd ~"/My Code"

El primero funciona porque el shell se expande ~ / en $ HOME /, y luego agrega My Code sin las comillas dobles. El segundo falla porque no hay un usuario llamado ' "' (comillas dobles) para ~"mapear.

Jonathan Leffler
fuente
9

Después de luchar con el mismo problema, probé dos soluciones diferentes que funcionan:

1. Utilice comillas dobles ( "") con sus variables.

La forma más fácil simplemente comillas dobles sus variables como se señaló en la respuesta anterior:

cd "$yourPathWithBlankSpace"

2. Hacer uso de eval.

De acuerdo con este comando de respuesta de Unix para escapar de los espacios , puede quitar el espacio en blanco y luego usarlo eval, así:

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

Una sola barra invertida me funciona:

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

¿Está seguro de que el problema no es que su script de shell esté cambiando de directorio en su subshell, pero luego regresará al shell principal (y al directorio original) cuando haya terminado? Evité eso usando. para ejecutar el script en el shell actual, aunque la mayoría de la gente solo usaría un alias para esto. Los espacios podrían ser una pista falsa.

Ry4an Brase
fuente
Gracias, Ry4an (y el resto de los encuestados). Parece que estaba ejecutando el script de forma incorrecta. Solo estaba tratando de ejecutarlo así:% ./cdsomedir No me di cuenta de que necesitaba usar el "." para ejecutar el script como lo hizo:%. cdsomedir.sh Una vez que hice eso, funcionó. Error de novato. ¡Gracias!
3

Evite ~ en los scripts; use $ HOME en su lugar.

Chris FA Johnson
fuente
2

Cuando se trabaja en Linux, la sintaxis siguiente es correcta:

cd ~/My\ Code

Sin embargo, cuando esté ejecutando su archivo, use la sintaxis siguiente:

$ . cdcode

(solo '.' y no './')

Alterlife
fuente
Por pura curiosidad, ¿por qué importa? Solo he visto './' usado.
whaley
./ generará un nuevo shell y luego cambiará el directorio. Entonces, cuando el script sale, vuelve al shell que generó el nuevo shell ... estará en el directorio donde ejecutó el script en lugar de ~ / My Code. '.' por otro lado, hace que el script se ejecute en la instancia actual del shell.
Alterlife
El punto "." es un comando de Unix, un alias para el comando "fuente". Debe ir seguido de un nombre de archivo. Entonces, "source myfile" ejecutará el archivo dentro de su shell actual. Y ". Myfile" hará lo mismo. La variable "./" significa "directorio actual" y no es un comando.
JPGConnolly
2

usar comillas dobles

go () 
{ 
    cd "$*"
}
Bobo
fuente
Gracias. Una adición útil a las funciones en un .bashrcarchivo para cambiar de directorio al pegar nombres de directorio que contienen espacios en la línea de comando sin tener que escapar de los espacios o citar todo. cdsaunque es un mejor nombre.
2016
¿Hay alguna forma de extender esto (sin un if) de manera que gosea ​​equivalente a cd, es decir, cd al directorio de inicio?
zennehoy
2

La forma más sencilla de hacer esto es-

 $ cd My\ Folder

En bash, ejecute el comando DIR y en los resultados verá que los nombres de carpeta o ruta que tienen espacio entre ellos se han escrito en los resultados de esta manera:

$dir
My\ Folder
New\ Folder
Mayukh Datta
fuente
2

Esto lo hará:

cd ~/My\ Code

Tuve que usar eso para trabajar con archivos almacenados en iCloud Drive. No querrás usar comillas dobles (") ya que entonces debe ser una ruta absoluta. En otras palabras, no puedes combinar comillas dobles con tilde (~).

A modo de ejemplo, tuve que usar esto para un proyecto reciente:

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

Espero que eso ayude.

Josh
fuente
1

Tuve un problema similar ahora donde estaba usando un script bash para volcar algunos datos. Terminé creando un enlace simbólico en la carpeta del script sin espacios en él. Luego señalé mi guión al enlace simbólico y eso funciona bien.

Para crear su enlace. ln -s [DIRECTORIO O ARCHIVO DE OBJETIVO] ./[CUTCUT]

Mau o puede que no sea de utilidad.


fuente
0

Utilice comillas simples, como:

myPath=~/'my dir'

cd $myPath
Jadian
fuente