Pregunta BASH Script para cd al directorio con espacios en pathname


Argggg. He estado luchando con este estúpido problema por días y no puedo encontrar una respuesta.

Estoy usando BASH en Mac OS X y me gustaría crear un archivo de script ejecutable simple que cambiaría a otro directorio cuando se ejecute. 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 ruta real es de cinco directorios profundos 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 estos funcionó.


76
2018-02-26 04:50


origen


Respuestas:


Cuando cite una ruta doble, está deteniendo la expansión de la tilde. Entonces hay algunas maneras de hacer esto:

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

La tilde no se cita aquí, por lo que la expansión de tilde seguirá ejecutándose.

cd "$HOME/My Code"

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

cd ~/My\ Code

También puede escapar caracteres especiales (como espacio) con una barra diagonal inversa.


68
2018-02-26 05:23



¡Oye! Vi esto en http://www.askdavetaylor.com/can_my_path_include_directory_names_with_spaces.html

x = "prueba \ me"
eval cd $ x

Una combinación de \ en una constante de texto de doble cita y un "eval" antes de "cd" hace que funcione como un hechizo.


28
2018-06-13 15:52



Puede usar cualquiera de:

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

No puede utilizar:

cd ~"/My Code"

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


7
2018-02-26 05:22



cd ~/My\ Code

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


6
2018-02-26 04:55



Una sola barra invertida funciona para mí:

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ás seguro de que el problema no es que tu script de shell esté cambiando de directorio en su subshell, sino que estás de vuelta en el shell principal (y en el directorio original) cuando termines? Lo evité usando. para ejecutar el script en el shell actual, aunque la mayoría de las personas solo usarían un alias para esto. Los espacios podrían ser una pista falsa.


4
2018-02-26 04:57



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

cd ~/My\ Code

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

$ . cdcode

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


2
2018-02-26 05:02



Evitar ~ en scripts; use $ HOME en su lugar.


2
2018-06-10 06:06



La forma muy simple de hacer esto es-

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder

2
2018-04-28 10:04



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

  • Solución1: la manera más fácil simplemente comilla las variables como se indicó en la respuesta anterior cd "$yourPathWithBlankSpace"
  • Solución2: de acuerdo con esta respuesta Comando de Unix para escapar espacios puedes quitar espacio en blanco y luego usar Eval, como este:

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


2
2017-12-03 10:43



Tuve un problema similar ahora que estaba usando un script bash para volcar algunos datos. Terminé creando un enlace simbólico en la carpeta de scripts sin ningún espacio en él. Luego apunté mi guión al enlace simbólico y eso funciona bien.

Para crear tu enlace ln -s [DIRECTORIO DE OBJETIVO O ARCHIVO] ./[SHORTCUT]

Mau o puede que no sea de uso.


1
2018-05-13 09:20



usar comillas dobles

go () 
{ 
    cd "$*"
}

1
2018-05-15 15:31