Я использую zsh и oh-my-zsh для своей среды оболочки в OS X, и мне трудно отследить, является ли происходящее результатом функции oh-my-zsh или поведения по умолчанию зш; это полностью косметическая проблема, но она сводит меня с ума.

Короткая версия заключается в том, что, если я cd в каталог, то, что выводится в моем приглашении из %c является именно тем аргументом, который был передан в cd ; поэтому, если я переключаюсь в каталог "test", но пишу его "tEst" случайно, то "tEst" - это то, что будет отображаться в моем приглашении. Это очень раздражает.

Еще один пример того, где он появляется, - когда я использую эту функцию оболочки (упрощенно из Brett Terpstra)

cdf()
 {
   target=`osascript -e 'tell application "Finder" to get POSIX path of (target of front Finder window as text)'`
   cd ${target}
 }

Когда я использую эту функцию, независимо от того, в каком каталоге я оказался, мой рабочий каталог отображается как ~target в моем приглашении.

Как я уже сказал, это абсолютно косметические проблемы, но это сводит меня с ума. Это zsh, oh-my-zsh, или есть другое расширение, которое я могу использовать в настройках своего приглашения, чтобы исправить это? Я использую iTerm 2, но я попробовал это в Terminal.app, и происходит то же самое.

1 ответ1

2

Две части вашего вопроса имеют разные решения.

cd TEst

Такое поведение является результатом взаимодействия двух причуд:

  • OS X по умолчанию использует файловую систему без учета регистра.
  • Оболочки устанавливают PWD в «текущий рабочий каталог, заданный командой cd », в отличие от абсолютного пути, сообщаемого системным вызовом getcwd .

Последняя особенность позволяет вам использовать символические ссылки, как если бы они были обычными каталогами. Запомнив путь, который вы ввели вместо абсолютного пути, оболочка позволяет вам cd symlink ... cd .. вернуться к тому, с чего вы начали. В файловой системе без учета регистра опечатки, такие как cd TEst ведут себя как символические ссылки, устанавливая PWD на введенный вами путь вместо имени файловой системы каталога.

Чтобы обойти это, вы можете использовать $(pwd -P) чтобы получить канонический путь, сообщаемый getcwd вместо логического пути оболочки. Помните, что это побочный эффект от разрешения всех символических ссылок в пути. Чтобы имитировать форматирование %c используйте: $(basename $(pwd -P | sed "s#$HOME#~#"))

Кроме того, вы можете преобразовать свою файловую систему в регистр, но некоторые приложения OS X, такие как Steam и Photoshop, несовместимы.

cd ${target}

Я не могу воспроизвести это поведение в OS X с простым zsh - это может быть проблема с oh-my-zsh или вашей конфигурацией. Хотя вы можете использовать тот же обходной путь $(pwd -P) для этого, другие сценарии и программы могут завершиться ошибкой, если $PWD не разрешит допустимый путь. Если вы можете воспроизвести проблему с минимальной установкой oh-my-zsh, вы должны сообщить об ошибке сопровождающим.

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