No se puede cd en el directorio con espacio en su nombre, incluso con comillas o escape

0

En un bash shell en una máquina MacOS, puedo ver al escribir lsque hay un director Application Support:

$ ls
Accounts                FontCollections     PreferencePanes
Application Scripts     Fonts               Preferences
Application Support     GameKit             Printers
Assistant               Google              PubSub
Assistants              Group Containers    Safari
Audio                   IdentityServices    SafariSafeBrowsing
Caches                  Input Methods       Saved Application State
Calendars               Internet Plug-Ins   Screen Savers
CallServices            Keyboard            Services
ColorPickers            Keyboard Layouts    Sharing
Colors                  KeyboardServices    Sounds
Compositions            Keychains           Spelling
Containers              LanguageModeling    Suggestions
Cookies                 LaunchAgents        SyncedPreferences
CoreFollowUp            Library             VirtualBox
Developer               Logs                Voices
Dictionaries            Mail                WebKit
F5Networks              Messages            com.apple.internal.ck
Family                  Metadata            iMovie
Favorites               Mobile Documents
FileProvider            Passes

Sin embargo, si intento cdingresar a este directorio usando comillas o caracteres de escape como se describe en ¿Cómo cd a un directorio que contiene un espacio en su nombre? , Sigo teniendo un error:

LM-SJN-21018636:Library kupeek$ cd "Application Support"
-bash: cd: Application: No such file or directory
LM-SJN-21018636:Library kupeek$ cd Application\ Support
-bash: cd: Application: No such file or directory

Parece que bash no está 'recogiendo' las comillas o los caracteres de escape y, en cambio, está buscando un directorio llamado "Aplicación". ¿Alguna idea de por qué esto no funciona?

Kurt Peek
fuente
2
Quizás tengas un alias o similar cdporque está mal escrito. ¿Qué command -v cdimprime?
Meuh
2
Sospecharía una función mal escrita. Y creo que command -v cddesde el primer comentario debería ser command -V cd(capital V); type -a cdTambién debería funcionar.
Kamil Maciorowski
1
¿Qué sucede si lo "llena automáticamente" con la tecla Tab? ¿Mismo error?
Aulis Ronkainen

Respuestas:

5

Tu cdpuede ser una función o alias mal definida. Corre type -a cdpara averiguarlo.

Un posible alias se explica en esta otra respuesta . Mi respuesta se concentra en las funciones de shell.

Por ejemplo, si la función utilizada

  • command cd $*( commandincorporado aquí ) o
  • command cd $@ o
  • command cd $1

en lugar de correcto

  • command cd "$@" o
  • command cd "$1" (No tan bueno como el anterior, todavía no es fatal)

y su Bash no arrojó too many arguments(versión anterior a la 4.4, vea esta pregunta ), el comportamiento sería exactamente como lo describió porque al Application Supportser un solo argumento de la función se dividiría la palabra dentro de la función, por command cdlo que sería Applicationsu primer argumento .

Si cdrealmente es una función mal definida, debe rastrear el lugar donde está definida y arreglarla. Una solución ad hoc sería agregar la commandpalabra antes cd, así:

command cd "Application Support"

o

command cd Application\ Support

(Esto también funcionará si el alias es el culpable).

Kamil Maciorowski
fuente
1

Intenta usar más de un conjunto de citas,

Por ejemplo, poner el nombre entre comillas simples entre comillas dobles:

cd "'Application Support'"

"Un argumento encerrado entre comillas dobles se presenta como una sola palabra, incluso si contiene separadores de espacios en blanco". Guía avanzada de secuencias de comandos Bash

El uso de dos conjuntos de comillas (comillas entre comillas) es una solución viable, suponiendo que el problema aquí es que el cdcomando original tiene un alias. La siguiente definición

alias cd='eval command cd'

reproduciría el problema reportado aquí (en la versión anterior a 4.4 de Bash, vea esta respuesta ). Sucede que evalanaliza la línea de comando por segunda vez y, en el primer paso del análisis, se elimina una capa de comillas. El uso de dos conjuntos de citas funciona porque, al eliminar el primer conjunto de citas, evalpasará el argumento con el segundo conjunto de citas a cd.

Si tal alias es el caso, la mejor solución es arreglarlo en primer lugar.

GiopperOne
fuente
Sencillo. Creo que el problema aquí es que el comando original "cd" tiene un alias. El alias obtiene la cadena de ruta como argumento y la obtiene correctamente si coloca el primer conjunto de comillas. Luego lo pasa a "cd" pero va allí sin comillas y falla. Si pone dos conjuntos de comillas, el alias obtiene la cadena con el primer conjunto y luego la pasa a "cd" con el segundo conjunto de comillas y ... ¡Magia, funciona!
GiopperOne
Gracias por su sugerencia, edité mi respuesta y agregué una referencia. No tengo que explicar aquí cómo modificar un alias "cd", eso estaría fuera de tema. Estoy respondiendo la pregunta "¿Alguna idea de por qué esto no funciona?", La respuesta es porque solo se usan comillas simples. Ponlo entre comillas dobles y funcionará.
GiopperOne
0

Podría haber más espacios en blanco u otros caracteres no imprimibles que no veas. Prueba cd Application*Scrip*o similar.

Aganju
fuente
1
Esto podría ser en algún otro caso, pero no en este particular. Tenga en cuenta que el mensaje es -bash: cd: Application: No such file or directory, no -bash: cd: Application Support: No such file or directory. El comando no ve toda la cadena de argumentos en primer lugar.
Kamil Maciorowski
0

SI sucdno es un alias extraño, entonces lo usaríaTABcon el autocompletado de bash (si está habilitado) para llenar un formato de trabajo para usted.

Mecanografía

cd ApTAB

parece que debería autocompletarse a algo como

cd Application\ S

(Si tiene un alias de CD extraño, entonces agregar la respuesta de Kamil de escribir también command cd A...debería funcionar con TAB)

y luego espere a que escriba más del nombre deseado (seguido de otro anotador TABpara completar automáticamente el resto). O simplemente escribiendo TABuna o dos veces más se mostrarán las opciones disponibles.

(Tampoco usaría plain ls, pero ls -lao tal ls -1vez para ver solo una entrada por línea, su lssalida no está clara)

Xen2050
fuente
Este puede ser un buen consejo en un caso general (es decir, para futuros usuarios con problemas similares), pero dudo que ayude de inmediato al OP. Tenga en cuenta que el mensaje es Application: No such file or directory, no Application Support: No such file or directory. Si el nombre del directorio en la línea de comando simplemente no coincide con el nombre real, cdaún así cumpliría con que todo el argumento es incorrecto. No desestimo las respuestas que pueden aplicarse a problemas muy similares, sin embargo, estoy señalando que no se ajustan por completo al problema del OP y no pueden explicar la raíz del problema.
Kamil Maciorowski
También lo pensé, pero es un poco molesto cuando el título no coincide completamente con el problema real (" My cdis broken "), y la pestaña completa solo se mencionó brevemente en un comentario, por lo que una respuesta más completa para el "problema del título" Parecía apropiado.
Xen2050
-1

Es porque te falta una palabra. Intenta usar:

cd "Application Support GameKit"
Biku B.
fuente
Me estoy repitiendo: esto podría ser en algún otro caso, pero no en este caso en particular. Tenga en cuenta que el mensaje es -bash: cd: Application: No such file or directory, no -bash: cd: Application Support: No such file or directory. El comando no ve toda la cadena de argumentos en primer lugar.
Kamil Maciorowski
Has leído mal el OP; son 2 columnas diferentes
Tetsujin