Zsh (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Zsh. Дата последней синхронизации: 2019-09-27. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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 в качестве оболочки по умолчанию

Смотрите раздел Командная оболочка#Выбор оболочки по умолчанию.

Совет: При замене bash пользователь может перенести некоторые участки кода из ~/.bashrc в ~/.zshrc (например, приглашение командной строки и псевдонимы), а также из ~/.bash_profile в ~/.zprofile (например, код, который запускает оконную систему X)

Файлы Запуска/Завершения

Совет: Смотрите Руководство пользователя Z-Shell, информацию о интерактивном входе в оболочку, и что включать в Ваш автозапуск.
Примечание:
  • Если $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.

Важно: Это делает компьютер уязвимым для"Island-hopping" атак. В этом случае, закоментируйте следующую строку или установите значение
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
Примечание: Чтобы это сработало, базу данных pkgfile нужно синхронизировать.

Игнорирование повторяющихся строк в истории

Чтобы игнорировать повторяющиеся строки в истории, используйте следующее:

~/.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) после тире.

Примечание: Это не будет работать, если у вас открыто более одной сессии zsh, и использование 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
Примечание: Эта фишка была найдена в PR для Oh My Zsh [2]

Функции

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

Смотрите также

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

Статьи на Английском: