Zsh (Русский)
Zsh является мощной современной оболочкой, которая работает как в интерактивном режиме, так и в качестве интерпретатора языка сценариев. Он совместим с bash (не по умолчанию, только в режиме emulate sh
), но имеет преимущества, такие как улучшенное завершение и подстановка.
Еще больше причин, по которым стоит использовать Zsh, перечислено в Zsh FAQ EN.
Установка
Перед установкой вы можете посмотреть, какая оболочка используется в данный момент:
$ echo $SHELL
Установите пакет zsh. Чтобы значительно расширить возможности автодополнения команд, установите также пакет zsh-completions.
Первоначальная настройка
Убедитесь, что Zsh был установлен правильно, выполнив следующую команду в терминале:
$ zsh
После этого вы должны увидеть скрипт zsh-newuser-install, который проведет вас через некоторые основные настройки. Если вы хотите пропустить первичную настройку, нажмите q
. Если скрипт не запустился, вы можете вызвать его вручную:
$ zsh /usr/share/zsh/functions/Newuser/zsh-newuser-install -f
Установка Zsh в качестве оболочки по умолчанию
Смотрите раздел Командная оболочка#Выбор оболочки по умолчанию.
~/.bashrc
в ~/.zshrc
(например, приглашение командной строки и псевдонимы), а также из ~/.bash_profile
в ~/.zprofile
(например, код, который запускает оконную систему X)Файлы Запуска/Завершения
- Если
$ZDOTDIR
не определена, используется$HOME
по умолчанию. - Если опция
RCS
не установлена ни в одном из файлов, файлы конфигурации не будут получены после этого файла. - Если опция
GLOBAL_RCS
не задана ни в одном из файлов, после этого файла не будут найдены глобальные конфигурационные файлы (/etc/zsh/*
).
При запуске Zsh по умолчанию он будет загружать следующие файлы в этом порядке:
/etc/zsh/zshenv
- Используется для установки общесистемных переменных environment variables (Русский); Он не должен содержать команд, которые производят вывод, или предполагает, что shell подключен к tty. Этот файл всегда будет источником, это нельзя переопределить.
$ZDOTDIR/.zshenv
- Используется для установки переменных среды пользователя; Он не должен содержать команд, которые производят вывод, или предполагает, что shell подключен к tty. Этот файл всегда будет источником.
/etc/zsh/zprofile
- Используется для выполнения команд при запуске, будет вызван при запуске как login shell. Обратите внимание, что в Arch Linux по умолчанию в нем содержится одна строка, в которой источником является
/etc/profile
./etc/profile
- Этот файл должен быть загружен всеми Bourne-совместимыми оболочками при входе в систему: он устанавливает
$PATH
и другие переменные окружения и специфичные для приложения (/etc/profile.d/*.sh
) при входе в систему.
$ZDOTDIR/.zprofile
- Используется для выполнения пользовательских команд при запуске, будет вызван при запуске как login shell.
/etc/zsh/zshrc
- Используется для настройки интерактивной конфигурации оболочки и выполнения команд, будет вызван при запуске как interactive shell.
$ZDOTDIR/.zshrc
- Используется для настройки интерактивной конфигурации пользователя и выполнения команд, будет вызван при запуске как interactive shell.
/etc/zsh/zlogin
- Используется для выполнения команд при завершении прогресса инициализации, будет вызван при запуске как login shell.
$ZDOTDIR/.zlogin
- Используется для выполнения пользовательских команд при завершении начального прогресса, будет вызван при запуске как login shell.
$ZDOTDIR/.zlogout
- Будет получен, когда login shell завершится.
/etc/zsh/zlogout
- Будет получен, когда login shell завершится.
- Пути, используемые в пакете Arch zsh, отличаются от используемых по умолчанию в man pages (FS#48992).
-
/etc/profile
не является частью обычного списка запускаемых файлов Zsh, но поступает из/etc/zsh/zprofile
в пакете zsh. Пользователи должны принять во внимание, что/etc/profile
устанавливает переменную$PATH
которая перезапишет любую переменную$PATH
установленную в$ZDOTDIR/.zshenv
. Чтобы это предотвратить, установите переменную$PATH
в$ZDOTDIR/.zprofile
.
/etc/zsh/zprofile
с чем-то другим, это нарушит целостность других пакетов, которые предоставляют некоторые сценарии в /etc/profile.d
.Настройка Zsh
Хотя Zsh может использоваться “из коробки”, он настроен не так, как хотело бы большинство пользователей. Из-за наличия огромных возможностей настройки, доступных в Zsh, этот процесс может оказаться сложным и трудоемким.
Простой .zshrc
Ниже приведён пример файла настроек, который обеспечивает достойный набор опций по умолчанию, а также предоставляет примеры многих вариантов настройки Zsh. Для того, чтобы использовать этот пример, сохраните его в виде файла с именем .zshrc
.
source ~/.zshrc
Вот простой .zshrc
:
~/.zshrc
autoload -U compinit promptinit compinit promptinit # Эта настройка установит тему walters для приглашения командной строки prompt walters
Настройка переменной $PATH
Информацию о настройке в zsh системных путей отдельно для каждого пользователя можно найти на странице проекта. Вкратце, добавьте в файл ~/.zshenv
следующие строки:
~/.zshenv
typeset -U path path=(~/bin /other/things/in/path $path[@])
Смотрите также примечание в разделе #Фреймворки настроек.
Автозавершение команд
Возможно, наиболее убедительной стороной Zsh является его передовые возможности автозавершения. Включите автозавершение в .zshrc
. Добавив следующую строку в ваш ~/.zshrc
:
~/.zshrc
autoload -U compinit compinit
Настройки выше включают в себя также ssh/scp/sftp завершения хостов, но для того, чтобы эта функция работала, пользователи должны предотвратить SSH от хеширования хостов имён в ~/.ssh/known_hosts
.
no
:
/etc/ssh/ssh_config
#HashKnownHosts yes
И поместите ~/.ssh/known_hosts
где-то еще, так что ssh создаст новый с un-hashed хостами (ранее известные хосты, таким образом, будут утеряны). Для получения более подробной информации смотрите тут кэшированные-хосты.
Для автозавершения с использованием клавиши-стрелки, добавьте следующие строки в:
~/.zshrc
zstyle ':completion:*' menu select
- Для активации меню нажмите TAB дважды.
Для автозавершения командной строки для алиасов (псевдонимов), добавьте следующее:
~/.zshrc
setopt completealiases
Позволяем разворачивать сокращенный ввод, к примеру cd /u/sh в /usr/share
~/.zshrc
autoload -U compinit && compinit
Обработчик неизвестных команд
В утилиту pkgfile входит Zsh скрипт, содержащий функцию command_not_found_handler
. При вводе неизвестной команды функция автоматически осуществляет поиск в официальных репозиториях.
Чтобы включить хук, нужно его прочитать. Например, добавьте с файл .zshrc
следующую строку:
~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
Игнорирование повторяющихся строк в истории
Чтобы игнорировать повторяющиеся строки в истории, используйте следующее:
~/.zshrc
setopt HIST_IGNORE_DUPS
Чтобы освободить историю от уже созданных дубликатов, запустите:
$ sort -t ";" -k 2 -u ~/.zsh_history | sort -o ~/.zsh_history
Команда ttyctl
[1] описывает ttyctl
команды в Zsh.
Это можно применить для "замораживания / размораживания" терминала.
Многие программы изменяют состояние терминала, и часто не восстанавливают настройки терминала нормально при выходе.
Чтобы избежать необходимости вручную сбрасывать терминал, используйте следующее:
~/.zshrc
ttyctl -f
Назначение клавиш
Zsh не использует Readline, вместо этого он использует свой собственный и более мощный ZLE. Т.е. не читает /etc/inputrc
или ~/.inputrc
.
Zle имеет emacs режим и vi режим. По умолчанию, он пытается взять клавиши emacs или vi из переменной среды $EDITOR
. Если она пуста, то по умолчанию будет Emacs. Измните это bindkey -e
или bindkey -v
соответственно в режиме Emacs или режиме VI.
Смотрите также zshwiki: bindkeys[устаревшая ссылка 2021-11-19].
Назначение клавиш в оболочке
Настраиваем нормальное поведение клавиш (не как в vi и emacs). Для этого в ~/.zshrc добавьте следующее:
[[ -n "${key[Home]}" ]] && bindkey "${key[Home]}" beginning-of-line [[ -n "${key[End]}" ]] && bindkey "${key[End]}" end-of-line [[ -n "${key[Insert]}" ]] && bindkey "${key[Insert]}" overwrite-mode [[ -n "${key[Delete]}" ]] && bindkey "${key[Delete]}" delete-char [[ -n "${key[Up]}" ]] && bindkey "${key[Up]}" up-line-or-history [[ -n "${key[Down]}" ]] && bindkey "${key[Down]}" down-line-or-history [[ -n "${key[Left]}" ]] && bindkey "${key[Left]}" backward-char [[ -n "${key[Right]}" ]] && bindkey "${key[Right]}" forward-char [[ -n "${key[PageUp]}" ]] && bindkey "${key[PageUp]}" beginning-of-buffer-or-history [[ -n "${key[PageDown]}" ]] && bindkey "${key[PageDown]}" end-of-buffer-or-history
Назначение клавиши в ncurses
Bind a ncurses application to a keystoke, but it will not accept interaction. Use BUFFER
variable to make it work. The following example lets users open ncmpcpp using Alt+\
:
~/.zshrc
ncmpcppShow() { BUFFER="ncmpcpp"; zle accept-line; } zle -N ncmpcppShow bindkey '^[\' ncmpcppShow
Альтернативный путь назначения клавиш в ncurses
Этот метод будет содержать всё, что вы ввели в строку перед вызовом приложения
~/.zshrc
ncmpcppShow() { ncmpcpp <$TTY; zle redisplay; } zle -N ncmpcppShow bindkey '^[\' ncmpcppShow
Горячие клавиши в файловом менеджере
Могут пригодится настройки клавиш использующиеся в графическом файловом менеджере. Первая комбинация показывает историю каталогов (Alt + Left), вторая позволяет пользователю перейти в родительский каталог (Alt + Up). Они также отображают содержимое каталогов.
~/.zshrc
cdUndoKey() { popd > /dev/null zle reset-prompt echo ls echo } cdParentKey() { pushd .. > /dev/null zle reset-prompt echo ls echo } zle -N cdParentKey zle -N cdUndoKey bindkey '^[[1;3A' cdParentKey bindkey '^[[1;3D' cdUndoKey
История поиска
Добавьте эти строки в .zshrc
~/.zshrc
[[ -n "${key[PageUp]}" ]] && bindkey "${key[PageUp]}" history-beginning-search-backward [[ -n "${key[PageDown]}" ]] && bindkey "${key[PageDown]}" history-beginning-search-forward
Doing this, only past commands beginning with the current input would have been shown.
Настройка строки приглашения (PROMPT)
Существует быстрый и легкий способ создать цветное приглашение в Zsh. Убедитесь что prompt установлен в autoload в файле .zshrc
. Это может быть сделано путем добавления этих строк:
~/.zshrc
autoload -U promptinit promptinit
Доступные цветовые схемы можно перечислить с помощью команды:
$ prompt -l
Для просмотра всех доступных тем (с примерами), используйте команду:
$ prompt -p
Например, чтобы использовать цветовую схему bigfade
, введите:
$ prompt bigfade
Чтобы использовать цветовую схему с заданным цветом (если доступен в теме), введите:
$ prompt elite2 blue
Настройка командной строки (PROMPT)
В отличие от bash zsh имеет два промта — левый и правый. Правый промт исчезает при вводе длинных команд, что делает его очень удобным для отображения не самой полезной информации, типа времени или текущего каталога. Промты настраиваются с помощью переменных PROMPT (левый) и RPROMPT (правый):
export PROMPT='%n@%m> ' export RPROMPT='[%~]'
Некоторые из специальных последовательностей, которые можно в них использовать: Последовательность - Описание %n - Имя пользователя %m - Имя компьютера (до первой точки) %M - Полное имя компьютера %~ - Путь к текущему каталогу относительно домашнего %d - Полный путь к текущей директории ($PWD) %T - Время в формате HH:MM %* - Время в формате HH:MM:SS %D - Дата в формате YY-MM-DD %B, %b - Начало и конец выделения жирным
По материалам этой статьи
Цвета
Zsh устанавливает цвета иначе, чем Bash. Добавьтеautoload -U colors && colors
до PROMPT=
в .zshrc
чтобы воспользоваться. Usually you will want to put these inside %{ [...] %}
so the cursor does not move.
$fg[color]
будет установлен цвет текста (значения, подставляемые вместо “color”, к примеру: red, green, blue, и т.д.. - по умолчанию установлены в любом формате до текста)
Команда | Описание | |
---|---|---|
%F{color} [...] %f |
фактически то же самое, что и предыдущий, но с меньшим набором. Можно также вставить префикс с номером F. | |
$fg_no_bold[color] |
будет использоваться не толстый текст с заданным цветом. | |
$fg_bold[color] |
будет использоваться толстый текст с заданным цветом. | |
$reset_color |
сбросит цвет текста, на цвет по умолчанию. Не сбрасывает толщину текста. Используйте %b для отмены утолщения. Saves typing if it's just %f though. |
|
%K{color} [...] %k |
устанавливает цвет фона. Того же цвета, как цвет без текста полужирным. Prefixing with any single-digit number makes the bg black. |
Возможные значения цвета | |
---|---|
black или 0
|
red или 1
|
green или 2
|
yellow или 3
|
blue или 4
|
magenta или 5
|
cyan или 6
|
white или 7
|
$fg['yellow']
выглядит коричневым или очень темно-желтым, в то время как
$fg_bold['yellow']
выглядит ярче или как обычный жёлтый.Цветной вывод команд
Раскрашивание вывода команд при помощи скрипта grc. Поставьте пакет grc (доступен для установки из репозитория [community])
И добавьте следующие строки в ваш ~/.zshrc
if [ -f /usr/bin/grc ]; then alias gcc="grc --colour=auto gcc" alias irclog="grc --colour=auto irclog" alias log="grc --colour=auto log" alias netstat="grc --colour=auto netstat" alias ping="grc --colour=auto ping" alias proftpd="grc --colour=auto proftpd" alias traceroute="grc --colour=auto traceroute" fi
Пример
Это пример двустороннего промта:
PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg_no_bold[yellow]%}%1~ %{$reset_color%}%#" RPROMPT="[%{$fg_no_bold[yellow]%}%?%{$reset_color%}]"
А вот как оно будет отображаться:
username@host ~ % [0]
Стек Каталогов
Zsh можно настроить, чтобы он помнил DIRSTACKSIZE (последние посещённые каталоги). Это пригодится для более быстрой работы с cd. Вам нужно добавить несколько строк, в файл настройки:
.zshrc
DIRSTACKFILE="$HOME/.cache/zsh/dirs" if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; then dirstack=( ${(f)"$(< $DIRSTACKFILE)"} ) [[ -d $dirstack[1] ]] && cd $dirstack[1] fi chpwd() { print -l $PWD ${(u)dirstack} >$DIRSTACKFILE } DIRSTACKSIZE=20 setopt autopushd pushdsilent pushdtohome ## Удалить повторяющиеся записи setopt pushdignoredups ## Это Отменяет +/- операторы. setopt pushdminus
Теперь используйте
dirs -v
Для вывода стека директорий. Используйте cd -<NUM>
чтобы вернуться к посещённому каталогу. Используйте автозавершение (нажав TAB
) после тире.
cd
, приведёт к конфликту в обоих ссессиях пишущих в тот же файл.Команда Help
В отличие от bash, zsh не позволяет использовать встроенный в help
команду для автодополнения. Чтобы использовать help
в zsh, добавьте следующие строки в ваш
zshrc
:
autoload -U run-help autoload run-help-git autoload run-help-svn autoload run-help-svk unalias run-help alias help=run-help
Подсветка синтаксиса как в Fish
Fish обеспечивает очень мощную подсветку синтаксиса. Для использования в zsh, вы можете установить zsh-syntax-highlighting из официального репозитория и обязательно добавьте в ваш ~/.zshrc
строку:
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
Примеры файла .zshrc
- Пакет grml-zsh-config, доступный в официальном репозитории взятый с https://grml.org/zsh содержит zshrc файл, который включает в себя множество настроек для Zshell. Эта настройка используется по умолчанию для ежемесячного ISO релиза.
- Базовая настройка с динамической строкой приглашения (Prompt) и заголовком окна / Hardinfo => https://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc;
- https://github.com/slashbeast/things/blob/master/configs/DOTzshrc[устаревшая ссылка 2020-08-06] - zshrc с несколькими функциями, - смотрите комментарии в файле. Известные особенности: подтверждение выключения, если пользователь запустил poweroff, а также запрос подтверждения на reboot или hibernate, поддержка GIT в Prompt (сделано без vcsinfo), завершение по TAB с меню, вывод текущей выполняемой команды в заголовке окна, и многое другое.
Фреймворки настроек
- oh-my-zsh управляемый сообществом, популярный фреймворк для настройки вашего Zsh. Он поставляется в комплекте с тонной полезных функций, помощников, плагинов, тем.
- Prezto - мгновенно прекрасный Zsh (доступен в prezto-gitAUR) настроенный фреймворк Zsh. Он поставляется с модулями, разумно расширяющих среду интерфейса командной строки (по умолчанию), псевдонимами (алиасами), функциями, атодополнением, и темами Prompt.
- Antigen (дступен в antigen-gitAUR) - менеджер плагинов для zsh, вдохновлённый oh-my-zsh и vundle.
Автозапуск приложений
$ZDOTDIR
по умолчанию $HOME
Zsh всегда выполняет /etc/zsh/zshenv
и $ZDOTDIR/.zshenv
так что не раздувайте эти файлы.
При входе в оболочку, читаются команды из /etc/profile
а потом $ZDOTDIR/.zprofile
. Затем, если оболочка является интерактивной, команды читаются из /etc/zsh/zshrc
а потом $ZDOTDIR/.zshrc
. Наконец, если в оболочку выполнен вход, читаются /etc/zsh/zlogin
и $ZDOTDIR/.zlogin
.
Смотрите также секцию STARTUP/SHUTDOWN FILES в zsh(1).
Постоянный rehash
Обычно compinit не находит новые исполняемые файлы в $PATH. Например после установки нового пакета, файлы в /usr/bin не сразу будут включены в автодополнение. Чтобы включить их в работу, выполните:
$ rehash
'rehash' может выполняться автоматически. Включите его в вашем zshrc
:
~/.zshrc
zstyle ':completion:*' rehash true
Функции
Zsh позволяет пользователю определять собственные функции, которые могут выполняться точно также как и обычные программы. Функции выполняются в том же процессе, что и вызвавшая их программа. При вызове функции аргументы передаются как позиционные параметры.
Распаковка архива
Чтобы распаковать архив не указывая тип распаковщика и его аркументы, а выполнив всего лишь команду вида ex имя_архива.bz2
Добавьте следующий код в ~/.zshrc
ex () { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.tar.xz) tar xvfJ $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "'$1' Не может быть распакован при помощи >ex<" ;; esac else echo "'$1' не является допустимым файлом" fi }
Упаковка в архив
Упаковка в архив командой pk 7z /что/мы/пакуем имя_файла.7z
- при этом архив будет в Домашней папке.
pk () { if [ $1 ] ; then case $1 in tbz) tar cjvf $2.tar.bz2 $2 ;; tgz) tar czvf $2.tar.gz $2 ;; tar) tar cpvf $2.tar $2 ;; bz2) bzip $2 ;; gz) gzip -c -9 -n $2 > $2.gz ;; zip) zip -r $2.zip $2 ;; 7z) 7z a $2.7z $2 ;; *) echo "'$1' не может быть упакован с помощью pk()" ;; esac else echo "'$1' не является допустимым файлом" fi }
Удаление
Измените оболочку по умолчанию перед удалением пакета zsh.
Запустите следующую команду:
$ chsh -s /bin/bash user
Где user - имя пользователя.
Используйте эту команду для каждого пользователя с установленной оболочкой zsh (в том числе и root при необходимости). После, удалите пакет zsh.
Кроме того, изменить оболочку по умолчанию обратно в Bash, можно редактируя /etc/passwd
от root.
vipw
когда редактируете /etc/passwd
это помогает предотвратить неверные записи и/или ошибки синтаксиса.Например, изменить следующие:
username:x:1000:1000:Full Name,,,:/home/username:/bin/zsh
На:
username:x:1000:1000:Full Name,,,:/home/username:/bin/bash
Смотрите также
Рекомендуем обязательно обратится к следующим Русскоязычным статьям, для более полного и лучшего понимания.
- Делаем из Zsh мороженку[устаревшая ссылка 2021-11-19]
- Советы по настройке Zsh
- Cправочная карта Zsh (PDF)
Статьи на Английском:
- A User's Guide to ZSH
- The Z Shell Manual (different format available here)
- Zsh FAQ
- zsh-lovers(1) (this is also available as zsh-lovers in offical repository)
- Zsh Wiki
- Gentoo Wiki: Zsh/HOWTO
- Bash2Zsh Reference Card