Si encuentras alguna incompatibilidad con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al proyecto final.
Solución:
$ cd "$DOCS"
necesitas cotizar "$DOCS"
para evitar que los espacios se analicen como separadores de palabras. La mayoría de las veces, las referencias variables deben citarse.
Tenga en cuenta que $HOME
tendria el mismo problema. El problema surge cuando el shell evalúa referencias de variables; no tiene nada que ver con las variables que usa o cómo las asigna. Es la expansión la que necesita ser cotizada.
$ echo $HOME
/home/my dir
Esto es engañoso. echo
en realidad está haciendo eco de las dos cadenas /home/my
y dir
. Si utiliza cd
o ls
verás cómo funciona realmente.
$ ls $HOME
ls: cannot access /home/my: No such file or directory
ls: cannot access dir: No such file or directory
$ cd $HOME
bash: cd: /home/my: No such file or directory
$ cd "$HOME"
¿Puedo preguntar por qué funciona cuando lo escribo manualmente pero no en una variable?
¡Gran pregunta! Examinemos los comandos que escribiste:
$ DOCS=""/cygdrive/c/Users/my dir/Documents""
$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"
$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory
La razón por la que esto no funciona es porque Bash no analiza las comillas dentro de las expansiones de variables. Eso lo hace realizar la división de palabras, por lo que los espacios en blanco en las expansiones de variables sin comillas se toman como separadores de palabras. Eso no analizar las comillas de ninguna manera, lo que significa que no puede poner comillas dobles dentro de una variable para anular la división de palabras.
$ cd $DOCS
Debido a esto, cd
se pasan dos parámetros. Hasta cd
sabe que parece que escribiste:
$ cd '"/cygdrive/c/Users/my' 'dir/Documents"'
Dos parámetros, con comillas dobles intactas.
SOLUCIÓN:
cd "Documents and Photos"
problema resuelto.
La razón por la que envío esta respuesta es que encontrará que los usuarios de todos los días (no solo desarrolladores web, programadores o usuarios avanzados) utilizan StackOverflow y este fue el resultado número uno para una pregunta simple de un usuario de Windows en Google.
Las personas son cada vez más conocedoras de la tecnología, pero no necesariamente están familiarizadas con la línea de comandos en los casos anteriores.
$ DOCS="/cygdrive/c/Users/my dir/Documents"
Aquí está tu primer problema. Esto pone un carácter de barra invertida real en $DOCS
como puede ver ejecutando este comando:
$ echo "$DOCS"
/cygdrive/c/Users/my `
Al definir DOCS
, necesita escapar del carácter de espacio. Puedes citar el string (usando comillas simples o dobles) o puede escapar solo el carácter de espacio con una barra invertida. No puedes hacer ambas cosas. (En la mayoría de los sistemas similares a Unix, puede tener una barra invertida en el nombre de un archivo o directorio, aunque no es una buena idea. En Cygwin o Windows, es un delimitador de directorio. Pero voy a asumir que el nombre real del directorio es
my dir
no my dir
.)
$ cd $DOCS
Esto pasa dos argumentos a cd
. El primero es cygdrive/c/Users/my
y el segundo es dir/Documents
. Sucede que cd
ignora silenciosamente todo menos su primer argumento, lo que explica el mensaje de error:
-bash: cd: /cygdrive/c/Users/my: No such file or directory
Para establecer $DOCS
al nombre de tu Documents
directorio, haga cualquiera de estos:
$ DOCS="/cygdrive/c/Users/my dir/Documents"
$ DOCS='/cygdrive/c/Users/my dir/Documents'
$ DOCS=/cygdrive/c/Users/my dir/Documents
Una vez que haya hecho eso, para cambiar a su Documents
directorio, encierre la referencia de la variable entre comillas dobles (esa es una buena idea para ningún referencia variable en bash, a menos que esté seguro de que el valor no tiene caracteres divertidos):
$ cd "$DOCS"
También puede considerar darle un nombre a ese directorio sin espacios, aunque eso puede ser difícil de hacer en general en Windows.
Aquí tienes las comentarios y puntuaciones
Recuerda algo, que tienes la capacidad de valorar este ensayo si diste con el arreglo.