Next: , Previous: , Up: Articles  


Преимущества и недостатки Z shell

Почему я яро предпочитаю Z shell вместо *ksh, tcsh, bash и прочих?

Сразу скажу, что 99% всех статей про zsh не поддерживаю, так как там будет сплошное нахваливание его системы дополнения. В преобладающем большинстве случаев она бесполезна (круто выглядит, но так ли экономит время и силы?) или даже вредна, при этом ощутимо визуально замедляет работу (из-за потребления ресурсов). Я не увидел пользы и в oh-my-zsh.

Сравню Z shell с GNU Bash, крайне распространённом и много чего умеющем shell. Отмечу только самые весомые преимущества:

Совместимость

В отличии от tcsh, он POSIX-совместимый. В отличии от ksh, он понимает башизмы (к сожалению, попадается дрянной софт их использующие). В отличии от bash он умеет все ksh-фичи.

Безопасность переменных (возможно самое важное преимущество)

Почти все проблемы с раскрытием переменных и их экранированием решены: это самая больная и ненавистная тема, когда речь заходит про программирование в shell. for i (**(.)) { pushd $i:h && mv $i:t $i:r.ext && popd } перейдёт в директории и переименует файлы, заменив расширение на .ext, даже если в именах будут присутствовать дефисы или пробелы. Это не оптимальный пример команды, конечно же, показанный только для примера.

Производительность

Он ощутимо быстрее работает/загружается. Хотя на современном мощном железе это уже не так заметно будет.

shared history (überfeature)

Между разными instance-ами.

autopushd (überfeature)

Почти всё перемещение только через стэк директорий.

мощнейший completion matcher (überfeature)

Который позволяет делать то, что когда, набрав s/2/r2s/auth/init<TAB>, я получу полностью раскрытый путь в виде src/rik2utils/rik2s/request_auther/__init__.py. При этом, на каждом элементе раскрытия может быть множество двусмысленных коллизий в именах. Это существенно быстрее дополнения постоянным нажатием TAB-а и приписывания имён файлов с самого начала.

синтаксическая подсветка

Типа вот такой оказывается очень удобной для быстрого ориентирования где какие аргументы/элементы команды. При этом никакого заметного overhead.

global aliases

Безумно часто ввожу anything G something M (равносильно anything | grep something | less).

**-path expansion, extended globbing

Искать файлы рекурсивно, написав всего-лишь **, при этом указывая кого проигнорировать, и ещё задав кучу условий (старее/новее, размером определённым, итд). **/*.php(.om[1]:h), **/*.{js,php,css}~(libs|temp|tmp|test)/*.

history expansion, globbing modifiers

Различные подстановки в команды в виде !#$:t:r (у текущей команды последний аргумент только с именем файла без расширения) и подстановки команд с глобальным substitution (!!:gs/.fs/.iso, последняя команда в которой все .fs заменены на .iso).

incremental pattern search in history

Инкрементальный поиск в истории по шаблону. В Bash нет поиска по шаблону.

упрощённый синтаксис

Таких команд как for/while: for i (...) something

именованные директории

Можно сказать, алиасы на директории. cd =blog ; pwd -> ~/work/proj/blog

zmv (überfeature)

Массовое переименование файлов. Особенно полезно когда нужно приводить музыкальные коллекции в порядок.

Плюс колоссальное количество мелочей упрощающих жизнь: mail notification, таймеры событий, калькулятор, %? (почему этого нет в Bash???) в PS1, >foo >bar tee-аналог, process substitution (paste <(cut -f1 file1)), autocorrection имён файлов и/или команд, alias-ы для директорий (~workdir), история посещённых директорий, сотни сотни настроек и widget-ов на любое нажатие клавиши в том или ином режиме, which expansion (=vim), просмотр/запись в файлы (< file, > file).

Какие же недостатки? Боюсь что я их не смогу назвать. Z shell всем лучше GNU Bash. Даже если забыть про функционал, то: размером своего кода; обилием легкочитаемой документации; гораздо более удобной и приятной настройкой, не выглядящей как хак-на-костыле; существенно более гибкой конфигурацией и возможностью изменения поведения.

Копия таблицы сравнений различных оболочек Christian Schneider-а:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    Y    N    Y

Key to the table above.

   Y      Feature can be done using this shell.

   N      Feature is not present in the shell.

   F      Feature can only be done by using the shells function
          mechanism.

   L      The readline library must be linked into the shell to enable
          this Feature.

Notes to the table above

    1. This feature was not in the orginal version, but has since become
       almost standard.
    2. This feature is fairly new and so is often not found on many
       versions of the shell, it is gradually making its way into
       standard distribution.
    3. The Vi emulation of this shell is thought by many to be
       incomplete.
    4. This feature is not standard but unoffical patches exist to
       perform this.
    5. A version called 'pdksh' is freely available, but does not have
       the full functionality of the AT&T version.
    6. This can be done via the shells programmable completion mechanism.
    7. Only by specifing a file via the ENV environment variable.

Полезные ссылки:


Next: Преимущества и недостатки ZFS, Previous: FreeBSD installation, Up: Articles