Для тех, кто ещё не знаком с Z Shell, а так же тем, кто находится на распутье в выборе шелла для повседневных задач, посвящается эта заметка, впервые опубликованная мной на хабре.

Надо сказать, о преимуществах zsh написано уже достаточно много материалов. Прежде всего, автором рекомендована к прочтению развёрнутая статья Алексея Федорчука о шеллах вообще и о zsh в частности. Что касается этой скромной заметки, она призвана показать читателю возможности обеих оболочек на конкретных примерах конфигурационных файлов. Упор сделан таки на zsh, ибо в понимании автора bash, как правило, пригоден к использованию изначально, zsh без собственных настроек лучше не использовать вовсе.

Полные конфигурационные файлы как обычно можно забрать с github.

Лучшее в shell - автодополнение

Автодополнение есть и в bash, этим в наше время никого не удивишь. Особенно хорош в этом смысле bash-completion, который позволяет дополнять не только пути к каталогам, но и эффективно искать пакеты для установки. Если вы ранее не использовали его, мой вам совет: обязательно установите. Дополнительных настроек для работы этого пакета не требуется.

Zsh может удивить вас, это действительно так. Пожалуй, автодополнение — одна из его сильнейших сторон. Сразу же нужно отметить тот факт, что zsh является модульным и для расширения его возможностей необходимо подключить или в некоторых случаях установить нужные модули. Кроме того, без индивидуальной настройки в zsh не обойтись: модули нужно будет включить в ваш .zshrc. Обратимся к практическим примерам:

для ArchLinux лучше сразу установить пакеты, подобные bash-completion, что позволит использовать автодополнение в поиске пакетов с pacman и AUR: это zsh-yaourt и zsh-packer. Найти их можно в том же AUR. Подключим наше автодополнение:

#Включить автодополнение
autoload -U compinit promptinit
compinit
promptinit
# Для pacman
[[ -a $(whence -p pacman-color) ]] && compdef _pacman pacman-color=pacman
# Корректировка ввода
setopt CORRECT_ALL
# Если в слове есть ошибка, предложить исправить её
SPROMPT="Ошибка! ввести %r вместо %R? ([Y]es/[N]o/[E]dit/[A]bort) "
# Не нужно всегда вводить cd
# просто наберите нужный каталог и окажитесь в нём
setopt autocd
# При совпадении первых букв слова вывести меню выбора
zstyle ':completion:*' menu select=long-list select=0
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

Уже неплохо, верно? Честно сказать, меня не прельщала перспектива перехода на zsh, поскольку в целом устраивал и bash. Но эксперимент показал: zsh — это очень удобно.

Горячие клавиши

Насколько мне известно, в bash горячие клавиши изменению не подлежат. Впрочем, не исключено, что я ошибаюсь. Это известные всем линуксоидам клавиши редактора emacs. Они взяты за основу и будут работать на любой машине, где установлен bash. Конечно, никто не запретит вам использовать стрелки для перемещения между символами или клавишу delete для удаления символа — это тоже есть в bash, и это тоже не нужно настраивать.

Обратимся к zsh. Да, как вы уже, наверное, догадались: в zsh всё нужно настроить под себя. Разумеется, было бы жутко, если бы нам пришлось настраивать каждую клавишу — вовсе нет! Можно выбрать один из двух стилей, ориентируясь на более привычный вам: режим vi или режим emacs. Рекомендация: выбирайте emacs, чтобы уверенно пользоваться горячими клавишами на любой машине с любым shell’ом, кроме того, наиболее популярен всё таки bash — ориентируйтесь на него. Разумеется, можно настроить отдельные сочетания клавиш так, как вам нравится. Пример:

bindkey '\e[3~' delete-char # del
bindkey ';5D' backward-word # ctrl+left
bindkey ';5C' forward-word #ctrl+right

Стандартные клавиши редактора emacs:

Ctrl+a     в начало строки
Ctrl+e     в конец строки
Ctrl+b     на символ назад
Ctrl+c     завершить
Ctrl+f     на символ вперед
Ctrl+k     удалить до конца строки
Ctrl+u     удалить все символы слева от курсора до начала строки
Сtrl+w     удалить символы слева от курсора до начала слова
Ctrl+t     меняет символ под курсором на предыдущий
Ctrl+Shift+- отмена
ALt+l      привести к нижнему регистру
Alt+u      привести к верхнему регистру
Alt+C      первая буква заглавная
Ctrl+l     clear
Ctrl+p     previous
Ctrl+n     next

Псевдонимы

Очень удобно бывает использовать псевдонимы различных команд. Алиасы замечательно настраиваются как в bash, так и в zsh. Отличие в том, что в zsh можно использовать не только команды, но и назначить расширения типов файлов для отдельных приложений. Чем это полезно? Благодаря этой возможности zsh может заменить вам даже файловый менеджер. Смотрите сами:

# Aliases
alias ls='ls --color=auto'
alias grep='grep --colour=auto'
alias sudo='A=`alias` sudo '
alias pacman='sudo pacman-color'
alias sc='sudo systemctl'
alias nc='sudo netcfg'
alias -s {avi,mpeg,mpg,mov,m2v}=mplayer
alias -s {odt,doc,sxw,rtf}=openoffice.org
alias -s {ogg,mp3,wav,wma}=cmus
autoload -U pick-web-browser
alias -s {html,htm}=chromium

Обратите внимание на строки, начинающиеся с alias -s. Теперь представьте: вы находитесь в директории с документами и среди них есть один или несколько с расширением .html. Что мы делаем обычно? Запускаем браузер, жмём Ctrl+O, выбираем файл и просматриваем его. Что позволяют сделать псевдонимы в zsh? Просто напишите название документа и он тут же будет открыт в браузере. Для этого сначала подгружается отдельный модуль pick-web-browser

История команд

И уж, конечно, ни один пользователь не оспорит удобство использования истории команд. Здесь zsh ничем особенным не отличается от bash. Настроим его:

#  History
# хранить историю в указанном файле
export HISTFILE=~/.zsh_history
# максимальное число команд, хранимых в сеансе
export HISTSIZE=1000
export SAVEHIST=$HISTSIZE
# включить историю команд
setopt APPEND_HISTORY
# убрать повторяющиеся команды, пустые строки и пр.
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_REDUCE_BLANKS

Прочие удобства

Для zsh есть одна прелюбопытнейшая вещь: плагин zsh-syntax-highlighting. Пользователи ArchLinux могут установить его из AUR, остальные — скачать из одноимённого проекта на github. Поставьте его, и ваш эмулятор терминала заиграет новыми красками. Изначально он ориентирован на любые терминалы — не только поддерживающие 256 цветов, поэтому некоторые цвета могут выглядеть не так, как нам нравится, но это можно настроить. Главный файл с настройками цветов располагается по пути: /usr/share/zsh/plugins/zsh-syntax-highlight/highlighters/main/main-highlighter.zsh. Но править непосредственно его нет нужды. Просто посмотрите, что хотели бы там исправить и измените цвета так, как вам нравится, используя таблицу поддерживаемых цветов.

Пример:

# zsh-syntax-highlighting from AUR
typeset -A ZSH_HIGHLIGHT_STYLES
ZSH_HIGHLIGHT_STYLES=(
        'alias'           'fg=153,bold'
        'builtin'         'fg=153'
        'function'        'fg=166'
        'command'         'fg=153'
        'precommand'      'fg=153, underline'
        'hashed-commands' 'fg=153'
        'path'            'underline'
        'globbing'        'fg=166'
)
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Также в zsh имеется очень популярный способ запаковки/распаковки архивов. Введите команду extract myfile.tar - распакуете архив, введите команду pk tar myfile - запакуете файл в архив указанного формата. Выходит, zsh может заменить архиватор?

Для распаковки впишем в .zhsrc:

# Распаковка архивов
# example: extract file
extract () {
    if [ -f $1 ] ; then
     case $1 in
     *.tar.bz2)   tar xjf $1        ;;
     *.tar.gz)    tar xzf $1     ;;
     *.bz2)       bunzip2 $1       ;;
     *.rar)       unrar x $1     ;;
     *.gz)        gunzip $1     ;;
     *.tar)       tar xf $1        ;;
     *.tbz2)      tar xjf $1      ;;
     *.tbz)       tar -xjvf $1    ;;
     *.tgz)       tar xzf $1       ;;
     *.zip)       unzip $1     ;;
     *.Z)         uncompress $1  ;;
     *.7z)        7z x $1    ;;
     *)           echo "I don't know how to extract '$1'..." ;;
     esac
     else
     echo "'$1' is not a valid file"
     fi
}

Для создания архивов:

# Запаковать архив
# example: pk tar file
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' cannot be packed via pk()" ;;
    esac
    else
    echo "'$1' is not a valid file"
    fi
}

Итоги

Zsh очень удобен для повседневной работы и делает добрую половину рутины за вас. Но стоит обратить внимание на различия между этими двумя оболочками. Например, в zsh после for обязательно вставлять пробел, нумерация массивов в zsh начинается с 1, чего совершенно невозможно понять. Так, если вы используете shell для повседневной работы, исключающей написание скриптов, используйте zsh. Если вам часто приходится писать свои скрипты, только bash! Впрочем, можно комбинировать. Как установить zsh в качестве оболочки по-умолчанию для отдельного пользователя:

$ chsh -s /bin/zsh your_user

P.S. Те арчеводы, которым при установке дистрибутива понравился .zshrc арча, могут установить готовый пакет из AUR: grml-zsh-config. Кроме того, вы можете заметить, что zsh работает медленнее в сравнении с bash. Чтобы ускорить некоторые команды, например, поиск по базе пакетов, следует включить кэш. Для этого создайте директорию .zsh/cache и укажите в .zshrc:

zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ~/.zsh/cache
⤧  Следующая запись Подсветка в nano