Как получить приглашение zsh формы: [рабочий каталог] # под macOS

#zsh #command-prompt

#zsh #командная строка

Вопрос:

В macOS Catalina (10.15.6) я хочу использовать zsh для сеансов терминала. Раньше я использовал bash по умолчанию. Для bash у меня был .profile, содержащий строку

 export PS1="[u@h:w]$ "
  

который выдал приглашение формы:

 [me@myhost:current-dir]$
  

Я хочу что-то подобное для zsh, но без префикса имени пользователя @host-name и с # вместо $ для фактического приглашения.

В сеансе терминала zsh команда

 PROMPT='[%/]%% '
  

выдает ожидаемое приглашение с текущим каталогом, заключенным в квадратные скобки.

Конечно, я не хочу вводить это вручную каждый раз. Вместо этого я хочу установить это в .zprofile. Итак, в .zprofile я включил строку

 export PROMPT='[%/]%% '
  

Однако это работает не так, как ожидалось — приглашение теперь имеет форму:

 me@myhost current-dir %
  

Вопрос: Как я могу получить приглашение zsh, чтобы иметь желаемую форму следующим образом?

 [current-dir] %
  

Комментарии:

1. Не имеет особого смысла вводить это в .zprofile , потому что вы хотите иметь настройки в каждом интерактивном zsh, не так ли? Я бы поместил их в .zshrc .

Ответ №1:

Просто добавьте следующий экспорт в ~/.zshrc, иначе он не будет работать.

  export PROMPT='[%1~] %%'
  

Это даст вам следующее, имя моего каталога test-workflow-branch-only

 [test-workflow-branch-only] %
  

ПРИМЕЧАНИЕ: Это даст вам, [~] % когда в ~/ каталоге, так что не пугайтесь, когда увидите, что

ОБНОВИТЬ — вопросы для комментариев

Мы добавляем его в ~/.zshrc, поскольку этот файл получает исходный код во всех конфигурациях интерактивной оболочки. Файл ~/.zprofile предназначен для команд, которые мы хотим выполнить при входе в систему, поэтому оболочка без входа в систему не будет использовать этот файл.

Комментарии:

1. Чтобы уточнить: это не сработает, если строка будет помещена в .zprofile вместо .zshrc?

2. @murray правильно, вы должны поместить строку в файл ~/.zshrc, поскольку этот файл получает исходные данные во всех конфигурациях интерактивной оболочки. Файл ~/.zprofile предназначен для команд, которые вы хотите выполнить при входе в систему, поэтому оболочка без входа в систему не будет использовать этот файл.

3. @murray: Это сработало бы, если бы ваша оболочка была интерактивной оболочкой входа, но это не сработало бы, если ваша оболочка является интерактивной оболочкой без входа. Кроме того, если ваша оболочка окажется неинтерактивной оболочкой входа в систему, настройки будут применены, но будут бессмысленными.

4. @user1934428: Извините, я не понимаю различия между «интерактивной оболочкой входа» и «интерактивной оболочкой без входа» здесь. Я использую macOS, и приглашение актуально только при открытии Terminal.app.

5. Zsh считает себя оболочкой входа, если она вызывается либо с помощью -L опции, либо по имени, начинающемуся с тире ( - ). Поскольку вам нужно только специальное поведение для интерактивной оболочки, я бы использовал решение, в котором вам не нужно заботиться о том, есть ли у вас оболочка для входа или без входа.

Ответ №2:

Спасибо за информацию от Эдварда Ромеро. Моя критика ответа заключается в том, что он содержит четыре потерянных символа, ‘[‘,’]’,’ ‘,’%’. Использование вместо этого PROMPT=’%d>’ дает хороший четкий абсолютный путь, что-то вроде этого:

 /Users/myuser/test-workflow-branch-only>
  

В любом случае, приятно избавиться от этой головной боли и начать пожинать плоды замечательных преимуществ использования zsh, какими бы они ни были.