2009-02-26 13 views
71

Argggg. He estado luchando con este estúpido problema por días y no puedo encontrar una respuesta.BASH Script para cd al directorio con espacios en el nombre de ruta

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 concedido, esto no es una ruta larga, pero mi nombre de ruta real es cinco directorios de profundidad y cuatro de esos directorios tienen espacios en la ruta.

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

+1

Tengo un problema similar al descrito. I.e. ninguna de las formas posibles de cambiar a un directorio que tiene un espacio en él. Nada como: cd "My Passport" cd Mi \ pasaporte cd Mi "Passport" nada está funcionando. La compilación funciona bien. Puedo enumerar: ls -l Mi \ Pasaporte/ funciona bien. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Lun Jul 16 08:49:50 EDT 2007 i686 i686 i386 GNU/Linux \> bash --ayuda GNU bash, versión 3.1.17 (1) -suelta- (i686-redhat-linux-gnu) ¿Alguna idea, por favor? –

Respuesta

6
cd ~/My\ Code 

parece que funciona para mí ... Si dejando caer las cotizaciones, pero manteniendo la barra no funciona, se puede colocar un código de ejemplo?

4

Una sola barra invertida funciona para mí:

[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 

¿Estás seguro de que el problema no es que el script está cambiando de directorio en su subnivel es, pero entonces estás de vuelta en el casquillo (y original dir) cuando haya terminado? 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.

+0

Gracias, Ry4an (y el resto de los encuestados). Parece que estaba ejecutando el script incorrectamente. Solo intentaba ejecutarlo de la siguiente manera: % ./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 principiante ¡Gracias! –

2

Cuando se trabaja bajo Linux es la siguiente sintaxis correcta:

cd ~/My\ Code

Sin embargo cuando se está ejecutando el archivo, utilice la siguiente sintaxis:

$ . cdcode

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

+0

Por curiosidad salvaje, ¿por qué importa eso? Solo he visto './' usado. – whaley

+0

./ generará un nuevo shell, y luego cambiará el directorio. Entonces, cuando el script sale, vuelve al shell que engendró el nuevo shell ... estarás en el directorio donde ejecutaste el script en lugar de ~/My Code. '.' por otro lado, hace que el script se ejecute en la instancia actual del shell. – Alterlife

+0

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

7

Puede usar cualquiera de:

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

No se puede utilizar:

cd ~"/My Code" 

Los primeros trabajos porque el shell expande ~/en $ HOME /, y luego tachuelas en mi código sin las comillas dobles. El segundo falla porque no hay un usuario llamado '"' (comillas dobles) para ~" al que se asigna.

67

Cuando realiza una doble cita de una ruta, está deteniendo la expansión de tilde. Así que hay algunas maneras de hacer esto:

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

La tilde no es citado aquí, todavía se llevará a cabo la expansión de modo tilde.

cd "$HOME/My Code" 

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

cd ~/My\ Code 

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

+2

Incluso podría cd ~/Mi '' Código, pero sería una tontería cuando puede escapar con una barra invertida en su lugar –

1

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 su enlace. ln -s [DIRECTORIO DE OBJETIVOS O ARCHIVO] ./[SHORTCUT]

Mau o pueden no ser de uso.

1

uso de comillas dobles

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

Gracias. Una adición útil a las funciones en un archivo '.bashrc' para cambiar el directorio al pegar nombres de directorio que contienen espacios en la línea de comando sin tener que escaparse de los espacios o citar todo el conjunto. 'cds' es un nombre mejor, sin embargo. – mattst

+0

¿Hay alguna forma de extender esto (sin un if) de modo que simplemente 'go' sea equivalente a' cd', es decir, cd al directorio de inicio? – zennehoy

1

Evitar ~ en secuencias de comandos; use $ HOME en su lugar.

1

La manera muy sencilla de hacer esto es-

$ cd My\ Folder 

En bash, ejecute el comando DIR y en los resultados que se encargaría de que los nombres de las carpetas o trayectoria que tiene el espacio entre ellos se ha escrito en los resultados como esto -

$dir 
My\ Folder 
New\ Folder 
1

Después de luchar con el mismo problema, he intentado dos soluciones diferentes que funciona:

  • Solución 1: La manera más fácil sólo comillas dobles variables como lo señaló en la respuesta anterior cd "$yourPathWithBlankSpace"
  • Solución 2: De acuerdo con esta respuesta Unix command to escape spaces puede despojar espacio en blanco a continuación, hacer uso de Eval, así:

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

Cuestiones relacionadas