Документация по ОС FreeBSD Суббота, 27.04.2024, 06:33
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Shell [40]

Главная » Статьи » Программирование » Shell

Zsh в качестве альтернативы bash [2010]
На большинстве UNIX-like систем в качестве стандартной командной облочки используется bash. Mac OS тут не исключение. Средства настройки ориентированы в первую очередь на GUI, но продвинутые пользовали знают и умеют выполнять множество задач из консоли. Зачастую это проще и быстрее. Одно дело когда запускаешь терминал редко, а другое когда в нем живешь. Я как раз один из таких людей и мне приходится часто искать способы оптимизации своего рабочего места. Переход от bash к zsh одно из ключевых звеньев этой оптимизации.

Ну, во первых, обо всем по порядку. Для того чтобы воспользоваться возможностями zsh в Mac OS X ничего дополнительно устанавливать не прийдется. Эта оболочка присутствует как в десктопной, так и в серверной версии дистрибутива. Активировать ее можно несколькими путями. Либо в настройках Terminal на первой вкладке в Command (complete path) вписать /bin/zsh, либо глобально. Если окончательно решили перейти на него, то лучше воспользоваться вторым способом. Для этого идем в System Preference, Accounts, жмем на иконку замка и вводим пароль пользователя. Затем нажать правой кнопкой мыши по имени пользователя, появится меню Advanced Options. Заходим туда и в графе Login shell меняем значение /bin/bash на /bin/zsh. Для применение изменений система рекомендует перезагрузиться, но фактически достаточно перелогиниться. Сразу после включения вы не увидите никаких новых фишек. Ну, разве что новую систему автодополнения, о который еще поговорим позже. Для того чтобы вкусить все прелести zsh нужно его настроить. Создаем в корне пользовательской директории несколько файлов:

touch ~/.zshrc
touch ~/.zsh_history
mkdir .zsh && touch ~/.zsh/cache

Основной конфигурационный файл будет находится в файле ~/.zsh. Его и будем редактировать. Конфиг у меня простой, но не маленький. Поэтому, постараюсь его комментировать поэтапно, а в конце поста дам ссылку на полный файл. Первое что я настроил это строка приглашения. Вариаций по ее настройке огромное множество. Хочу сразу предупредить что гибкость этого шелла безумно высока, поэтому я буду говорить о вещах только в рамках своего конфига. Просто остальное читайте в документации. Строк приглашения может несколько. Расположить ее/их можно практически в любом месте. Я предпочитаю отдать дать уважения классике и не извращаться.

PROMPT='%B%F{green}%n@%m%f:%F{blue}%~%f%b%(!.#.$) '

Единственное что я сделал это разукрасил ее в зеленый и синий цвета. Так удобней проследить где начало и конец между выводом какой-либо из команд. Список и описания вышепреведенных значений можно прочитать, например тут — Setting the promt.

Теперь настроим автодополнение. Возможности этой функции еще богаче. По умолчанию предлагается дополнение команд похожее на bash, но только выбор следующего каталога или файла показывается интерактивно.

autoload -U compinit compinit zmodload zsh/complist zstyle ':completion:*' menu yes select

Включаем меню выбора для навигации по дополнениям курсорами или табом. Теперь это больше похоже не на шелл, а на полноценный файловый менеджер.

export CLICOLOR=1 export LSCOLORS=exfxcxdxbxegedabagacad export
export LS_COLORS='di=34;40:ln=35;40:so=32;40:pi=33;40:ex=31;40:bd=34;46:cd=34;43:su=0;41:
sg=0;46:tw=0;42:ow=0;43:'
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

Включаем цвета в Terminal и задаем раскраску папок и файлов. В данном случае я использую две переменные — LSCOLORS и LS_COLORS. Первая это BSD стиль и она применима на Mac OS и BSD-like системах. Вторая будет работать в GNU/Linux. Таким образом наш конфиг получается универсальным. Если хотите поменять цвета можно воспользоваться специальным веб сервисом — LSCOLORS Generator.

zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cache
setopt AUTO_CD BSD_ECHO

Включаем использование кэша и решаем проблемы вывода команды echo на Mac OS и иных BSD системах. Также активируем невероятно полезную опцию Autocd. Продемонстрирую то как она работает на примере. С обычной командой cd нам надо набрать имя каталога или его первые буквы, затем жать Tab, потом набрать следующий каталог и так далее, пока не прийдем к конечному. В zsh можно поступить проще. Для того чтобы перейти, например, в директорию /var/www/nginx/snupt.com можно набрать cd /v/w/n/s и нажать Tab. Все остальное сделает zsh. Это очень удобно и очень быстро. Попробуйте один раз и уже трудно будет отказаться.

if [ -e $HOME/.ssh/known_hosts ] ; then hosts=(${${${(f)"$(<$HOME/.ssh/known_hosts)"}%%\ *}%%,*})
zstyle ':completion:*:hosts' hosts $hosts fi

Автодополнение SSH хостов. Я работаю с множеством серверов и эта функция также незаменима для меня. Рекомендуется всем администраторам.

export HISTFILE=~/.zsh_history
export HISTSIZE=1000
export SAVEHIST=1000
setopt APPEND_HISTORY HIST_IGNORE_ALL_DUPS HIST_IGNORE_SPACE HIST_REDUCE_BLANKS

Включаем протоколирование истории, размер файла, опции игнорирования пустых строк, лишних пробелов и повторяющихся команд.

autoload -U predict-on
zle -N predict-on
zle -N predict-off
bindkey "^X^Z" predict-on # C-x C-z
bindkey "^Z" predict-off # C-z

А эта опция с помощью горячих клавиш включает поиск по истории в режиме реального времени прямо в текущей строке. С помощью Ctrl+X+Ctrl+Z включаем, а через Ctrl+Z выключаем. Впрочем в конфиге и так все понятно.

bindkey '^[[3~' delete-char bindkey '^E' expand-cmd-path

Заставляет нормально работать клавишу Delete. До этого она ставила тильды. И активируем клавишу автоподставления полного адреса. Например, пишем команду tcpdump, жмем Ctrl+E и получаем /usr/sbin/tcpdump. Некий аналог whereis.

_force_rehash() { (( CURRENT == 1 )) && rehash return 1 }
zstyle ':completion:::::' completer _force_rehash _complete

Этот код нужен для того чтобы zsh находил новые команды без перезахода. Пример. Открыто два терминала. В одном происходит установка приложения, бинарник попадает по одному из путей переменной PATH. Там где ставили мы уже можем его запустить, во втором терминале нет. С помощью force_rehash мы решим эту проблему. Любителям screen посвящается.

alias df='df -h' alias
du='du -sh'
alias grep='egrep --color=auto'
hash -d data=/Volumes/Data\ HD/
hash -d itunes=/Volumes/Data\ HD/Music/iTunes\ Music/
[ -r /etc/debian_version ] && [ -x 'which sudo' ] && alias upgrade='sudo apt-get update && sudo apt-get -u upgrade'

Алиасы это отдельный разговор. Их существует несколько типов. Более подробно читайте в документации. Расскажу только про hash. Это функция которая умеет запоминать каталоги где бы они не находились. В моем домашнем конфиге это путь на внешний винт и в каталог iTunes. Для того чтобы туда попасть нужно просто набрать ~itunes или ~data. На серверах просто незаменимо. С остальным экспериментируйте сами.

autoload -U zcalc zed

У этой командной оболочки есть и свои приложения. Например, калькулятор, текстовый редактор… тестрис. Дада. Тестрис. Можно устроить турнир с emacs’ерами.

Это лишь малая часть функционала zsh. О многом я не сказал, но если вам интересно, то без труда разберетесь. Один раз потратив время на настройку в будущем можно сэкономить много времени. Если вас устраивает мой конфиг можете есть скачать тут — zshrc. Статья получилась сильно гиковская по сравнению с тем что публиковалось раньше. Но часть публики, уверен, оценит. Да и мне полезно, чтобы не забыть. Ниже прилагаю несколько ссылок на хорошую документацию. Вопрос жду, как всегда, в комментариях.



Источник: http://snupt.com/zsh-alternative-to-bash/
Категория: Shell | Добавил: oleg (25.09.2010) | Автор: SNUPT
Просмотров: 1467 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024