На большинстве 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 нужно его настроить. Создаем в корне пользовательской директории несколько файлов:
Основной конфигурационный файл будет находится в файле ~/.zsh. Его и будем редактировать. Конфиг у меня простой, но не маленький. Поэтому, постараюсь его комментировать поэтапно, а в конце поста дам ссылку на полный файл. Первое что я настроил это строка приглашения. Вариаций по ее настройке огромное множество. Хочу сразу предупредить что гибкость этого шелла безумно высока, поэтому я буду говорить о вещах только в рамках своего конфига. Просто остальное читайте в документации. Строк приглашения может несколько. Расположить ее/их можно практически в любом месте. Я предпочитаю отдать дать уважения классике и не извращаться.
Единственное что я сделал это разукрасил ее в зеленый и синий цвета. Так удобней проследить где начало и конец между выводом какой-либо из команд. Список и описания вышепреведенных значений можно прочитать, например тут — Setting the promt.
Теперь настроим автодополнение. Возможности этой функции еще богаче. По умолчанию предлагается дополнение команд похожее на bash, но только выбор следующего каталога или файла показывается интерактивно.
Включаем цвета в Terminal и задаем раскраску папок и файлов. В данном случае я использую две переменные — LSCOLORS и LS_COLORS. Первая это BSD стиль и она применима на Mac OS и BSD-like системах. Вторая будет работать в GNU/Linux. Таким образом наш конфиг получается универсальным. Если хотите поменять цвета можно воспользоваться специальным веб сервисом — LSCOLORS Generator.
Включаем использование кэша и решаем проблемы вывода команды 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 хостов. Я работаю с множеством серверов и эта функция также незаменима для меня. Рекомендуется всем администраторам.
А эта опция с помощью горячих клавиш включает поиск по истории в режиме реального времени прямо в текущей строке. С помощью Ctrl+X+Ctrl+Z включаем, а через Ctrl+Z выключаем. Впрочем в конфиге и так все понятно.
Заставляет нормально работать клавишу Delete. До этого она ставила тильды. И активируем клавишу автоподставления полного адреса. Например, пишем команду tcpdump, жмем Ctrl+E и получаем /usr/sbin/tcpdump. Некий аналог whereis.
Этот код нужен для того чтобы 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. Статья получилась сильно гиковская по сравнению с тем что публиковалось раньше. Но часть публики, уверен, оценит. Да и мне полезно, чтобы не забыть. Ниже прилагаю несколько ссылок на хорошую документацию. Вопрос жду, как всегда, в комментариях.