# Zsh (Русский)

Состояние перевода: На этой странице представлен перевод статьи Zsh. Дата последней синхронизации: 7 февраля 2016. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Zsh является мощной современной оболочкой, которая работает как в интерактивном режиме, так и в качестве интерпретатора языка сценариев. Он совместим с bash (не по умолчанию, только в режиме `emulate sh`), но имеет множество преимуществ, таких как:

- Эффективность
- Усовершенствованное автодополнение по `Tab`
- Программируемое автодополнение, которое помогает пользователям вводить как команды, так и их аргументы, со встроенной поддержкой нескольких сотен команд
- Расширенная поддержка переменных и массивов
- Полностью настраиваемый
- Исправление опечаток

Еще больше причин, по которым стоит использовать 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)

## Файлы настроек

При запуске Zsh читает файлы и применяет из них настройки в таком порядке:

`/etc/zsh/zshenv`
  Этот файл должен содержать команды установки значений для глобальной переменной $PATH, а также других общесистемных переменных окружения; он не должен содержать команды, выводящие какую-либо информацию или предполагающие, что оболочка запущена в виртуальной консоли (tty)
`~/.zshenv`
  Похож на `/etc/zsh/zshenv`, но содержит настройки конкретного пользователя. Обычно используется для установки некоторых полезных переменных окружения
`/etc/zsh/zprofile`
  Это глобальный файл настроек, который будет задействован при входе в систему. Обычно используется для выполнения некоторых важных команд при входе в систему. Пожалуйста, обратите внимание, что по умолчанию в Arch Linux он содержит одну строку, читающую содержимое файла `/etc/profile`. Для получения дополнительной информации смотрите раздел #Глобальные файлы настроек
`/etc/profile`
  Содержимое этого файла читается всеми Bourne-совместимыми оболочками при входе в систему: он устанавливает окружение на время сессии и применяет специфичные настройки приложений (`/etc/profile.d/*.sh`). Обратите внимание, что в Arch Linux Zsh также читает его по умолчанию
`~/.zprofile`
  Этот файл, как правило, используется для автоматического выполнения скриптов пользователя при входе в систему
`/etc/zsh/zshrc`
  Глобальный файл настроек, будет прочитан и применен при запуске интерактивной оболочки
`~/.zshrc`
  Основной конфигурационный файл пользователя, будет прочитан и применен при запуске интерактивной оболочки
`/etc/zsh/zlogin`
  Глобальный файл настроек, будет прочитан и применен в конце процесса инициализации при запуске в качестве оболочки входа
`~/.zlogin`
  Такой же, как `/etc/zsh/zlogin`, но хранит настройки конкретного пользователя
`/etc/zsh/zlogout`
  Глобальный файл с настройками, будет использоваться при выходе из оболочки
`~/.zlogout`
  Такой же, как `/etc/zsh/zlogout`, но хранит настройки конкретного пользователя

Примечание:

- Пути, используемые в пакете zsh для Arch Linux, отличаются от путей по умолчанию, используемых на страницах справочных руководств
- `/etc/profile` не является частью регулярного списка файлов автозапуска Zsh, но запускается из `/etc/zsh/zprofile` пакета zsh. Пользователи должны принять к сведению, что `/etc/profile` устанавливает значение для переменной `$PATH`, в результате чего значение, присвоенное в `~/.zshenv`, будет перезаписано. Чтобы предотвратить это, устанавливайте значение для переменной `$PATH` в файле `~/.zshrc` (не рекомендуется заменять строку, имеющуюся по умолчанию в

`/etc/zsh/zprofile`, на что-то другое, поскольку будет нарушена целостность других пакетов, предоставляющих некоторые скрипты в `/etc/profile.d`)

### Глобальные файлы настроек

Пользователи могут захотеть применять некоторые настройки глобально, для всех пользователей Zsh. На странице Zsh(1) говорится, что для этого существует несколько файлов, например, `/etc/zshrc`. Однако, в Arch могут быть отличия, так как он был составлен с флагами специально для замены [1] `/etc/zsh/`.

Итак, для глобальных настроек используется `/etc/zsh/zshrc`, а не `/etc/zshrc`. То же самое касается `/etc/zsh/zshenv`, `/etc/zsh/zlogin` и `/etc/zsh/zlogout`. Обратите внимание, что эти файлы не устанавливаются по умолчанию, создайте их при необходимости.

Единственным исключением является `zprofile`, вместо которого следует использовать файл `/etc/profile`.

## Настройка 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 (Русский)#Команда не найдена.

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

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

    ~/.zshrc

    setopt HIST_IGNORE_DUPS

Чтобы освободить историю от уже созданных дубликатов, запустите:

    $ sort -t ";" -k 2 -u ~/.zsh_history | sort -o ~/.zsh_history

### Команда ttyctl

[2] описывает `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.

#### Назначение клавиш в оболочке

Настраиваем нормальное поведение клавиш (не как в 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`

Note: Утолщённый текст не обязательно использовать тогоже цвета что и обычный. Например, `$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, доступный в официальном репозитории взятый с http://grml.org/zsh содержит zshrc файл, который включает в себя множество настроек для Zshell. Эта настройка используется по умолчанию для ежемесячного ISO релиза.
- Базовая настройка с динамической строкой приглашения (Prompt) и заголовком окна / Hardinfo => http://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc;
- https://github.com/slashbeast/things/blob/master/configs/DOTzshrc - 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 в `man zsh`.

### Постоянный rehash

Обычно compinit не находит новые исполняемые файлы в $PATH. Например после установки нового пакета, файлы в /usr/bin не сразу будут включены в автодополнение. Чтобы включить их в работу, выполните:

    $ rehash

'rehash' может выполняться автоматически. Включите его в вашем `zshrc`:

    ~/.zshrc

    zstyle ':completion:*' rehash true

Примечание: Эта фишка была найдена в PR для Oh My Zsh [3]

## Функции

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 мороженку
- Советы по настройке 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

Categories:

- Command shells (Русский)
- Русский