В оболочке bash на компьютере с MacOS можно увидеть, набрав ls что есть директор 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

Однако, если я пытаюсь cd - диск в этот каталог , используя либо кавычки или управляющие символы , как описано в Как кд в каталог, который содержит пробел в имени? Я все еще получаю ошибку:

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

Кажется, что bash не "подбирает" кавычки или escape-символы, а вместо этого ищет каталог под названием "Приложение". Есть идеи, почему это не работает?

5 ответов5

5

Ваш cd может быть плохо определенной функцией или псевдонимом. Запустите type -a cd чтобы узнать.

Возможный псевдоним объясняется в этом другом ответе. Мой ответ концентрируется на функциях оболочки.

Например, если функция используется

  • command cd $* command встроенный объяснил здесь) или
  • command cd $@ или
  • command cd $1

вместо правильного

  • command cd "$@" или
  • command cd "$1" (не так хорошо, как указано выше, все еще не смертельно)

и ваш Bash не бросать too many arguments (предварительный вариант 4.4 см этого вопроса), то поведение будет именно так , как вы описали , потому что Application Support являются один аргумент функции претерпит слово расщепления внутри самой функции, поэтому command cd будет видеть Application качестве первого аргумента.

Если ваш cd действительно плохо определенная функция, вы должны отследить место, где она определена, и исправить ее. Специальным решением было бы добавить command слово перед cd , например так:

command cd "Application Support"

или же

command cd Application\ Support

(Это также будет работать, если виновником является псевдоним).

1

Попробуйте использовать более одного набора цитат,

например, поместите имя в одинарные кавычки в двойные кавычки:

cd "'Application Support'"

«Аргумент, заключенный в двойные кавычки, представляется как одно слово, даже если он содержит разделители пробелов». Расширенное руководство по написанию сценариев

Использование двух наборов кавычек (кавычек в кавычках) - это приемлемый обходной путь, если предположить, что проблема заключается в том, что исходная команда cd была псевдонимом. Следующее определение

alias cd='eval command cd'

воспроизведет описанную здесь проблему (в версии Bash до 4.4 см. этот ответ). Случается, что eval анализирует командную строку во второй раз, и при первом проходе синтаксического анализа один слой цитирования удаляется. Использование двух наборов цитат работает, потому что, удалив первый набор цитат, eval передаст аргумент со вторым набором цитат к cd .

Если такой псевдоним имеет место, лучшим решением будет исправить его в первую очередь.

0

Если ваш cd не является странным псевдонимом, то я бы просто использовал TAB с автозаполнением bash (если он включен), чтобы заполнить рабочий формат для вас.

Typing

CD Ap TAB

Похоже, он должен заполнить что-то вроде

cd Application\ S

(Если у вас есть странный псевдоним cd, то добавление ответа Камиля о наборе command cd A... должно работать и с TAB)

а затем подождите, пока вы наберете больше нужного имени (а затем еще один TAB для автозаполнения остальных). Или просто нажмите TAB один или два раза, чтобы отобразить доступные параметры.

(Я бы также не использовал простой ls , но вместо ls -la или, возможно, ls -1 чтобы увидеть только одну запись в строке, ваш вывод ls не ясен)

0

Там может быть больше пробелов или других непечатаемых символов, которые вы не видите. Попробуйте cd Application*Scrip* или подобное.

-1

Это потому что ты скучаешь по одному слову. Попробуйте использовать:

cd "Application Support GameKit"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .