Zsh
| Автор | Пол Фальстад (Paul Falstad) |
|---|---|
| Первый выпуск | 1990 |
| Тип | командная оболочка Unix |
| Совместимость | POSIX sh (в режиме эмуляции), во многом Bash |
| Лицензия | MIT-подобная (Zsh License) |
| По умолчанию | macOS Catalina (10.15) и новее, Kali Linux |
| Файлы настройки | ~/.zshenv, ~/.zprofile, ~/.zshrc, ~/.zlogin |
| Сайт | zsh.org |
Zsh (Z shell) — командная оболочка для Unix-подобных систем, расширяющая классический Bourne shell (sh). Zsh понимает почти все скрипты для Bash, но добавляет к ним развитое программируемое автодополнение, расширенный глоббинг (шаблоны имён файлов), исправление опечаток, общую историю между сессиями и систему тем и плагинов. С версии macOS Catalina (2019) zsh — оболочка по умолчанию на Mac.[3]
История
Первую версию написал в 1990 году Пол Фальстад, тогда студент Принстона. Название происходит от логина преподавателя Чжуна Шао (Zhong Shao) — zsh. Со временем проект перешёл к сообществу; разработку координирует группа мейнтейнеров, исходники и документация доступны на zsh.org.[1]
Широкую популярность zsh получил в 2010-х благодаря фреймворку Oh My Zsh (2009), который упростил установку тем и плагинов.[4] Переход Apple на zsh был связан с лицензией: Bash в macOS оставался на версии 3.2, последней под GPLv2, а более новые версии распространяются под GPLv3.
Отличия от Bash
Zsh не является строгим надмножеством Bash, но различия обычно заметны только в скриптах.[5]
| Возможность | Bash | Zsh |
|---|---|---|
| Индексы массивов | с 0 | с 1 (по умолчанию) |
Разбиение $var на слова |
да | нет (без setopt SH_WORD_SPLIT) |
Рекурсивный глоб **/ |
с shopt -s globstar |
встроен |
| Квалификаторы глоба | нет | *(.), *(/), *(om[1,5]) |
| Правый промпт | нет | RPROMPT |
| Автодополнение | bash-completion | compsys, с меню и описаниями |
Отсутствие разбиения переменных на слова — частый источник сюрпризов при переносе скриптов, но и защита от целого класса ошибок с пробелами в именах файлов. Для переносимых скриптов принято писать #!/bin/sh или #!/usr/bin/env bash, а zsh использовать как интерактивную оболочку.
Возможности
Глоббинг. Квалификаторы в скобках фильтруют файлы прямо в шаблоне: ls **/*.py(.m-7) — обычные файлы .py, изменённые за последнюю неделю, во всех подкаталогах; rm *(.L0) — пустые файлы. Это часто заменяет связку find и xargs.
Автодополнение. Система compsys знает аргументы тысяч команд (git, docker, kubectl, ssh-хосты из ~/.ssh/config), показывает меню со стрелками и подсказками. Включается строками:
autoload -Uz compinit && compinit
zstyle ':completion:*' menu select
История. Опции SHARE_HISTORY, HIST_IGNORE_DUPS, EXTENDED_HISTORY позволяют делить историю между окнами терминала, убирать дубли и хранить время выполнения команд.
Прочее. Автоматический cd по имени каталога (AUTO_CD), стек каталогов (pushd/popd, cd -<Tab>), коррекция опечаток (CORRECT), глобальные алиасы (alias -g G='| grep'), модульная загрузка функций через autoload.
Файлы настройки
Zsh читает конфигурацию в определённом порядке:[2]
~/.zshenv— всегда, для любых экземпляров (в том числе скриптов); подходит для переменных окружения вродеPATH.~/.zprofile— для оболочек входа (login shell).~/.zshrc— для интерактивных оболочек: алиасы, промпт, плагины.~/.zloginи~/.zlogout— при входе и выходе.
Системные аналоги лежат в /etc/zsh/ или /etc/.
Фреймворки и плагины
- Oh My Zsh — самый популярный фреймворк: сотни плагинов (
git,docker,kubectl) и тем. Минус — замедляет запуск оболочки. - Prezto, zinit, antidote — более лёгкие менеджеры плагинов с ленивой загрузкой.
- zsh-autosuggestions — подсказывает команду из истории серым текстом; zsh-syntax-highlighting — подсвечивает синтаксис по мере ввода.
- Powerlevel10k и кроссплатформенный Starship — быстрые информативные промпты (ветка git, код возврата, версия языка).
Практика
# сменить оболочку на zsh
chsh -s "$(command -v zsh)"
# замерить скорость запуска
time zsh -i -c exit
# проверить, какая оболочка запущена
echo $ZSH_VERSION
Если запуск занимает больше 200–300 мс, обычно виноваты тяжёлые плагины или повторный compinit; профилировать можно модулем zmodload zsh/zprof.