О zsh не раз писали на хабре. Однако, и как те топики, и как мои личные наблюдения, показывают, что большинство людей, знакомых с zsh, используют его как bash с продвинутым автокомплитом. Да и тот (автокомплит) используют не на полную катушку.
Я не хочу описывать как раскрасить консоль во все цвета радуги или сделать промт, показывающий всё на свете. Я хочу показать, что возможности zsh гораздо шире, и его использование в качестве основной оболочки может сделать вашу работу немного краше.
Алиасы
В zsh они бывают четрырёх видов:
- стандaртные (флаг -r) — ведут себя точно так же как и в bash
- суффиксы (флаг -s) — позволяют ассоциировать файлы по расширению с определённым приложением
- глобальные (флаг -g) — в отличие от стандартных поиск ведётся по всей строке, а не только там, где может быть команда
- хэши — этакие алиасы для директорий
Про первые два вида писали и не раз. Интереснее два последних.
Глобальные алиасы
alias -g g="| grep"
alias -g l="| less"
позволит вместо
cat where | grep what | less
делать
cat where g what l
Пример утрированный, и в реальности алиасы могут (и должны) быть сложнее. Но даже этот пример показывает профит для тех, кому приходится много грепать и работать с пайпами.
Без указания флага при создании алиаса, он ведет себя и как стандартный и как глобальный. Но я рекомендую указывать флаг для избежания неоднозначностей.
Алиасы можно временно выключать/включать при помощи
disable -a aliasname
enable -a aliasname
Также, если алиас переназначает какую-либо команду, можно достучаться и до неё
aliasname
#or
=aliasname
Хэши
hash -d apl=/private/var/log/apache2
hash -d p1=/srv/www/project1/html
Теперь для перехода в директорию, обозначенную как хэш, достаточно выполнить
cd ~hashname
или вовсе
~hashname
если вы пользуетесь опцией autocd.
Разумеется, хэши можно использовать и в любых иных операциях, связанных с файловыми путями:
cat ~hashname/file
cp ~hashname/file /path/somewhere
Автокомплит
Он в zsh поистине могуч.
Помимо того, что он умеет дополнять опции многих команд (да и свой комплит написать несложно), zsh позволяет крутить им как угодно:
zstyle ':completion:*:processes' command 'ps -ax'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;32'
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always
zstyle ':completion:*:processes-names' command 'ps -e -o comm='
zstyle ':completion:*:*:killall:*' menu yes select
zstyle ':completion:*:killall:*' force-list always
Данный конфиг доставит нам комплит для комманд kill и killall:
DevMan% killall F
Finder ForkLift
DevMan% kill 502
502 ?? 2:49.10 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_53261
823 ?? 14:29.44 /System/Library/StagedFrameworks/Safari/WebKit2.framework/WebProcess.app ...
1509 ?? 4:28.21 /Applications/Xmarks for Safari.app/Contents/MacOS/Xmarks for Safari -psn_0_340051
Решение о том стоит ли применять регистронезависимый комплит оставляю вам. Хотя лично я от него получаю намного больше пользы, чем вреда.
Хуки
Хуки — функции, вызывающиеся при определённом событии.
Я активно использую 3 из них:
- chpwd – как можно догадаться из названия, вызывается при смене текущей директории.
- preexec – вызывается перед выполнением любой команды.
- precmd – вызывается перед выводом промта.
Первый использую для восстановления всех консолей в тех директориях, в которых находился до ребута/логаута.
Второй и третий хуки я использую, в частности, для уведомления о процессах, выполняющихся дольше заданного времени: запустил, например, сборку проекта и переключился на выполнение других задач, когда сборка закончится в notification center прилетит уведомление о готовности.
Напоследок немного zsh-магии
ls *(.) # показать только файлы
ls *(.om[1]) # показать самый свежий файл
ls -l *(.m0) # показать файлы измененные сегодня
ls **/style.css # найти style.css по всем дискам
ls -l *(.Lk+50) # показать все файлы более 50 Кб
ls **/*(.Lm+5) # показать файлы более 5 Мб по всем дискам
ls *.^log # показать все файлы, кроме .log
vi *(.om[1]) # открыть самый свежий файл
# многое из магии требует setopt EXTENDED_GLOB
Это ничтожный пример того, на что способен zsh.
Не были затронуты модули, которых достаточно.
В качестве учебного пособия, кроме родных манов и гайда, рекомендую поизучать
- oh-my-zsh
- zsh-completions
- ну и конечно же ZWS
Если тема будет интересна, продолжим.
Приятного всем кодинга!
Автор: DevMan