настройка приглашений zsh
Бывает так, что, работая бОльшую часть времени только с одной учётной записи и с одного хоста, осознаешь бессмысленность раздутого на пол-экрана терминала приглашения командной строки наподобие
myuseraccount@mycomputer:/path/to/some/folder $
Зная, что в zsh можно задействовать второе приглашение, справа и, умея пользоваться гуглом, проковырявшись с настройкой конфига, хотелось бы поделиться куском скрипта, который, скопировав в .zshrc, будет делать следующее:
1. в обычном состоянии - показывать в качестве приглашения лишь
[/path/to/current/folder] >
2. при работе за другого пользователя - показывать
[/path/to/current/folder] > [current_username]
3. при работе с другим хостом (например, про соединении по ssh) с учётной записи, которая совпадает с текущим именем пользователя - показывать
[/path/to/current/folder] > [@current_hostname]
4. при работе с другим хостом с другой учётной записи - показывать
[/path/to/current/folder] > [current_username@current_hostname]
5. при работе с машиной, на которой запущен ssh-сервер _и_ есть подсоединённые клиенты - показывать
[/path/to/current/folder/] [@current_hostname]
6. ну и независимо от всего этого, при работе суперюзером ">" будет меняться на классическое "#"
# ... if [[ $EUID == 0 ]]; then #если пользователь - root PS1='[ %~ ] # '; #выставить одно приглашение else PS1='[ %~ ] > '; #в противном случае - другое fi PROMPT=$PS1; function precmd { #функция precmd выполняется после каждой выполненной в терминале команды; #в данном случае, при наличии немалого числа действий в этой функции, #при работе с терминалом не на самой быстрой машине, #можно будет невооружённым глазом заметить #задержку появления приглашения командной строки name=''; host=''; other=''; RPROMPT=''; ssh=`ps ax | grep [s]sh | wc -l`; #проверяется, запущен ли ssh-сервер и есть ли процессы, #имеющие отношение к ssh, помимо самого сервера. if [[ $USERNAME != 'user' ]] && [[ $USERNAME != 'root' ]]; then #если текущее имя пользователя системы #не совпадает с пользователем, с аккаунта которого работаем name='%n'; other=true; fi if [[ $HOST != 'desktop' ]] || [[ $ssh -gt 1 ]]; then #если текущее имя хоста системы не совпадает с хостом, #с которого работаем или если к хосту, #с которого работаем, кто-то подсоединился по ssh host='@%m'; other=true; fi if [[ $other != '$NULL' ]]; then RPROMPT=[$name$host]; title='\e]0;$RPROMPT\a'; else title='\e]0;Terminal\a'; fi if [[ $TERM == 'xterm' ]]; then #если текущий терминал запущен из X-ов #(xterm/rxvt/konsole/gnome-terminal/и т.д.) print -Pn $title; #вывести информацию в заголовке терминала fi } #...
Примечание 0. Не стреляйте в пианиста, он играет, как умеет^W^W^W^W^W^W^Wругайте за качество и стилистику кода - состряпал на скорую руку :-)
Примечание 1. чтобы это всё работало, кусок скрипта (как и zsh-оболочка в качестве shell'а) должен быть у пользователя в конфигурационном файле как на стороне клиента, так и сервера; причём, опять же, чтобы всё это работало "красиво", в случае коннекта к ssh-серверу за другого пользователя, у этого пользователя также должна быть zsh оболочкой по умолчанию и должен быть кусок конфига.
Примечание 2. чтобы работала часть скрипта, отвечающего за >/# , в качестве оболочки для root-аккаунта должна быть также выбрана zsh и такой же кусок скрипта должен находиться в /root/.zshrc
Примечание 3. Если при использовании zsh в домашнем каталоге Вы для настройки каждой из фич используете отдельный конфигурационный файл, то можно поместить скрипт в .zsh_prompt, создав его, а в сам .zshrc, ближе к началу - строчку
. ~/.zsh_prompt
краткий список основных условных переменных zsh:
- %n - имя пользователя
- %m - имя хоста
- %~ - текущая директория
- %? - код завершения последней команды
- %h - номер строки в файле истории текущей команды
Данный совет - всего лишь пример того, как можно, имея общее представление о возможностях конфигурирования zsh, донастроить эту оболочку под себя и заставить отображать любую полезную информацию где угодно.
Happy zshacking :-)
- Добавить комментарий
- 1898 просмотров
Страница для печати


Использование условий доступно прямо в теле приглашения:
например проверка root`овости: