Bash vs Z shell: A Tale of Two Command Line Shells
Recently, Apple announced that as of the next version of macOS, Catalina, they will be adopting zsh as their default shell in replacement of bash. As a budding data science student, having learned all my command line on bash, I wondered how this would affect me. Had what I learned in bash just become useless?? Let’s take a look at the two and find out.
A Little Background of Bash and Zsh
The “Bourne-again shell” or bash for short was created in 1989 by Brian Fox. It is a Unix shell and command language written as a replacement for the Bourne shell. It has been distributed widely as the default login shell for most Linux distributions and Apple’s macOS. Bash introduced improvements over Bourne shell including its ability to be used as a scripting language. Users could write their own shell scripts for automating tasks.
“Z shell” or zsh for short, was created in 1990 by Paul Falstad. It is also a Unix shell and command language based on Bourne shell with a large number of improvements, including some features of bash. Zsh also had the ability to be used as a scripting language with the ability to use shell scripts. It currently has very strong community following and support.
Bash vs. zsh:
For the most part bash and zsh are almost identical which is a relief. Navigation is the same between the two. The commands you learned for bash will also work in zsh although they may function differently on output. Zsh seems to be much more customizable than bash. I’ll now run through a few features and how they differ in each.
Auto-completion
One helpful function of both shells is the tab auto-completion functions. In both shells you can type the command followed by pressing tab to display available options after the command. Zsh’s tab-completion is more feature rich giving you a list of options that can be then navigated and selected by the arrow keys rather than having to struggle with case or mess with long list of folders with spaces in it. Zsh even has tab completion for Git!
Auto-correction
If you type fast and loose, in zsh if you make a typo while writing a command, for example, spell correction is built in, will automatically detect the typo, and ask if you want to correct it.
Plug-in support
Zsh has an online community called Oh My Zsh which is one of the oldest and most popular options for managing zsh. It offers over 250 plugins and 140 different themes supplied by the community. This allows users to work in an environment set up specifically to their work flow. Below is a preview of the git plug in.
Bash has a large set of programming functions such as looping and conditional constructs, tilde and brace expansions, and the use of aliases. Bash is also an older and established shell meaning it also has tons of online resources for finding what you need to do. Many of the features of zsh can be replicated in bash through various methods.
Take Zsh for a Spin!
Want to try out zsh before the release of macOS catalina? If you are on macOS you most likely already have zsh on your computer. You can check by running the command: which zsh
If zsh is present on your system it, the path for the installation will be returned. From there to switch to zsh run the command: chsh -s /bin/zsh and you will be prompted for your password.
To start using zsh restart your terminal.
If you want to switch back to bash, run the command: which bash , which will give you the location of your bash installation. Then run: chsh -s /bin/bash
Restart your terminal, and you will be back to familiar territory.
So Which is Better?
All in all, running either shell will get the job done. The current issue with the version of bash on macOS is it is an outdated version 3.2. The current version is 5.0. This is speculated to be mostly due to licensing issues at apple. The switch to an updated shell will be a welcome change.
It seems to be mostly preference when it comes to choosing one over the other. Many of the conveniences provided by zsh can be made to function in bash as well. In my opinion, zsh seems more helpful to me as a newer shell user. Your milage may vary.
Introduction¶
This article aims only to differences between zsh and bash. Author has no experiences with others. Both of them are categorized as unix shells.
Sh (Bourne Shell)¶
This unix shell is not a subject of this article, but I’d like to mention it because its name Bourne shell could be confused as bash by beginners. This shell was created in 1977 by Stephen R. Bourne, who worked in AT &T Bell Laboratories. This shell can be found in most of today’s unix computers under the path /bin/sh . Bourne shell was a replacement for the Thompson shell, whose executable file had the same path /bin/sh .
Bash (Bourne again shell)¶
Bash is unix POSIX shell which was created by Free Software Foundation ( FSF ). Development started in 1988 by Brian Fox as replacement for sh . Syntax of bash is a superset of the Bourne shell. It can call it as extension of the bourne shell or advanced bourne shell, because bash has a lot extra features against to bourne shell, but syntax is preserved as the bourne shell. Bash is used in most of nowadays linux distributions as default shell under the path /bin/bash . MacOS used bash as default shell until 2019, when they’ve switched to zsh . One of reason why Apple chnaged was a new license GPL -3.0 for bash 4.0.
Zsh (Z shell)¶
Zsh is also unix shell under license MIT . Zsh is extended bourne shell with much improvements. Zsh also added some really favorite functions from ksh , bash and tcsh . Original author of zsh was Paul Falstad who created the zsh during his study on Princeton University and the name of zsh was created by his professor Zhong Shao. Zsh can be call as command and programming language. zsh is used in MacOS or Kali Linux nowadays. Path to execute this shell is /bin/zsh .
Differences between ZSH and BASH ¶
Word splitting upon parameter expansion¶
Word Splitting Space is taken as special char which separate each arguments and commands. So if we save some text with spaces to shell variable, we have to remember, when we’d like to expansion this variable.
Parameter Expansion (Substitution) If we want to use expansion we have to use dollar-sign as syntax . When we use dollar-sign before to var name, content of variable will expand to command line and we can use the content with some command.
As you can see in example above, parameter expansion evaluate each word separate by space as one argument for command printf . If we dont want to allow word splitting after parameter expansion we have to put the expansion to double-quotes “ in bash.
But this approach will not work in zsh , because word splitting is disable by default. So there is opposite situation how enable word splitting upon parameter expansion?
Word splitting is disable by default
It does not matter in zsh if we used double-quotes to disable word splitting upon parameter expansion (or substition) because of default disabled value.
So if we want to use word splitting we have to use special syntax = for perform word splitting.
Word splitting upon parametr expansion could be set globally with option shwordsplit .
Globbing pattern upon parameter expansion¶
Glob is command which is able to match filenames by pattern which we created. Paterrns consists of basic wildcards as:
- * — match any number and any character in filename including also none
- ? — match exactly one any character
- [abc] — match exactly one character which is a , b or c
- [b-g] — match exactly one character which is in range b-g
, where each wildcard has own special meaning. Dont confuse globbing with regex . Although it is similar concept, there is absolutely different usage. By default glob does not match hidden files start with dot . .
Glob pattern can be saved in shell variable. There occurs problem with parameter (variable) expansion again.
As you can see in example above, expansion is proceeded that asterisk is taken as glob wildcard.
When we used double-quoutes, asterisk is used as text (string) after expansion and command takes asterisk as filename not as wildcard. If we’ve really created file with name * then ls will not invoke exception.
Globbing upon parameter expansion is disabled by default, so asterisk is not used as pattern for globbing but like filename.
If we want to enable pattern globbing after expansion we have to use special syntax
We can use different approach and save to parameter at the beginning by running glob pattern in subshell. Subshell start by run the command in simple parentheses. So during expansion there will not be the asterisk char but filenames matched by glob in subshell.
Globbing upon parametr expansion could be set in zsh globally with option globsubst .
ZSH word split and glob expansion together¶
There is also option to combine special syntax for * word splitting upon expansion = * and globbing upon expansion
zsh и bash: что выбрать
Для тех, кто ещё не знаком с Z Shell, а так же тем, кто находится на распутье в выборе шелла для повседневных задач, посвящается эта заметка.
Надо сказать, о преимуществах zsh написано уже достаточно много материалов. Что касается этой скромной заметки, она призвана показать читателю возможности обеих оболочек на конкретных примерах конфигурационных файлов. Упор сделан таки на zsh, ибо в понимании автора bash, как правило, пригоден к использованию изначально, zsh без собственных настроек лучше не использовать вовсе.
Полные конфигурационные файлы автора можно забрать с github.
I. Лучшее в shell — автодополнение
Автодополнение есть и в bash, этим в наше время никого не удивишь. Особенно хорош в этом смысле bash-completion, который позволяет дополнять не только пути к каталогам, но и эффективно искать пакеты для установки. Если вы ранее не использовали его, мой вам совет: обязательно установите. Дополнительных настроек для работы этого пакета не требуется.
Zsh может удивить вас, это действительно так. Пожалуй, автодополнение — одна из его сильнейших сторон. Сразу же нужно отметить тот факт, что zsh является модульным и для расширения его возможностей необходимо подключить или в некоторых случаях установить нужные модули. Кроме того, без индивидуальной настройки в zsh не обойтись: модули нужно будет включить в ваш .zshrc. Обратимся к практическим примерам.
Для ArchLinux лучше сразу установить пакеты, подобные bash-completion, что позволит использовать автодополнение в поиске пакетов с pacman и AUR: это zsh-yaourt и zsh-packer. Найти их можно в том же AUR. Подключим наше автодополнение:
Уже неплохо, верно? Честно сказать, меня не прельщала перспектива перехода на zsh, поскольку в целом устраивал и bash. Но эксперимент показал: zsh — это очень удобно.
II. Горячие клавиши
Насколько мне известно, в bash горячие клавиши изменению не подлежат. Впрочем, не исключено, что я ошибаюсь. Это известные всем линуксоидам клавиши редактора emacs. Они взяты за основу и будут работать на любой машине, где установлен bash. Конечно, никто не запретит вам использовать стрелки для перемещения между символами или клавишу delete для удаления символа — это тоже есть в bash, и это тоже не нужно настраивать.
Обратимся к zsh. Да, как вы уже, наверное, догадались: в zsh всё нужно настроить под себя. Разумеется, было бы жутко, если бы нам пришлось настраивать каждую клавишу — вовсе нет! Можно выбрать один из двух стилей, ориентируясь на более привычный вам: режим vi или режим emacs.
Рекомендация: выбирайте emasc, чтобы уверенно пользоваться горячими клавишами на любой машине с любым shell’ом, кроме того, наиболее популярен всё таки bash — ориентируйтесь на него.
Разумеется, можно настроить отдельные сочетания клавиш так, как вам нравится.
Пример:
III. Алиасы
Очень удобно бывает использовать алиасы различных команд. Алиасы замечательно настраиваются как в bash, так и в zsh. Отличие в том, что в zsh можно использовать не только команды, но и назначить расширения типов файлов для отдельных приложений. Чем это полезно? Благодаря этой возможности zsh может заменить вам даже файловый менеджер. Смотрите сами:
Обратите внимание на строки, начинающиеся с alias -s. Теперь представьте: вы находитесь в директории с документами и среди них есть один или несколько с расширением .html. Что мы делаем обычно? Запускаем браузер, жмём Ctrl+O, выбираем файл и просматриваем его. Что позволяют сделать алиасы в zsh? Просто напишите название документа и он тут же будет открыт в браузере.
Для этого сначала подгружается отдельный модуль pick-web-browser
IV. История команд
И уж, конечно, ни один пользователь не оспорит удобство использования истории команд. Здесь zsh ничем особенным не отличается от bash. Настроим его:
V. Прочие удобства
Для zsh есть одна прелюбопытнейшая вещь: плагин zsh-syntax-highlighting. Пользователи ArchLinux могут установить его из AUR, остальные — скачать из одноимённого проекта на github. Поставьте его, и ваш эмулятор терминала заиграет новыми красками.
Изначально он ориентирован на любые терминалы — не только поддерживающие 256 цветов, поэтому некоторые цвета могут выглядеть не так, как нам нравится, но это можно исправить. Главный файл с настройками цветов располагается по пути:
/usr/share/zsh/plugins/zsh-syntax-highlight/highlighters/main/main-highlighter.zsh. Но править непосредственно его нет нужды (спаибо, ZyXI за указание на ошибку).
Измените цвета так, как вам нужно в .zshrc и активируйте плагин.
Пример:
Также в zsh имеется очень популярный способ запаковки/распаковки архивов. Введите команду extract myfile.tar — распакуете архив, введите команду pk tar myfile — запакуете файл в архив указанного формата. Выходит, zsh может заменить архиватор?
Для распаковки впишем в .zhsrc:
Для создания архивов:
VI. Итоги
Zsh очень удобен для повседневной работы и делает добрую половину рутины за вас. Но стоит обратить внимание на различия между этими двумя оболочками. Например, в zsh после for обязательно вставлять пробел, нумерация массивов в zsh начинается с 1, чего совершенно невозможно понять.
Так, если вы используете shell для повседневной работы, исключающей написание скриптов, используйте zsh. Если вам часто приходится писать свои скрипты, только bash! Впрочем, можно комбинировать.
Как установить zsh в качестве оболочки по-умолчанию для отдельного пользователя:
Баш против. Zsh – различия, которые вы должны знать
л inux наиболее известен своей свободой (свободой слова, а не бесплатным пивом). Это позволит вам делать что угодно с вашей системой, которая доходит до такой степени, что она даже взорвется, если вы ей скажете. Эта свобода в основном доступна для пользователей через оболочка операционной системы (оболочку можно рассматривать как интерфейс к операционной системе). Этой оболочкой обычно является Bash, но опять же, благодаря свободе, в этом нет необходимости.
Сегодня мы рассмотрим альтернативную оболочку под названием Z оболочка в последнее время он привлекает большое внимание и популярность, и на то есть веская причина. Мы также увидим, как он отличается от нашего старого доброго Баша.
Зш введение
Пол Фалстад создал zsh в 1990 году. Если вы думали, что Zsh намного новее, чем Bash, это не так, поскольку Bash был разработан в 1988 году. Он был назван в честь логина профессора Йельского университета Чжун Шао. Первоначально он был разработан как подмножество Csh, но в конечном итоге он пересекся с Tcsh и Ksh и теперь стал оболочкой, превосходящей даже Bash в некоторых отношениях.
Он всегда был популярен среди некоторых пользователей, но приобрел популярность, когда Apple приняла его в качестве оболочки по умолчанию для своей Mac OS Catalina в 2019 году. Даже Kali Linux сделала его по умолчанию в выпуске 2020.4.
Zsh был разработан с учетом лучшего взаимодействия с пользователем. Функции, которые Zsh по умолчанию имеет по сравнению с Bash по умолчанию, направлены на то, чтобы сделать оболочку более интерактивной, сделав ее гораздо более доступной и удобной для пользователей всех уровней опыта. У него есть специфические отличия в написании сценариев от Bash, но это не представляет проблемы. Zsh сам по себе также является привлекательным языком сценариев.
Баш против. Zsh — ключевые отличия функций
1. Автодополнение
Наиболее важная и частая функция, которая заставляет пользователей стекаться в Zsh, — это функция автозаполнения. Пожалуйста, не заблуждайтесь, в Bash есть функция автозаполнения, но она работает не так, как Zsh. В качестве примера Bash предположим, что вы хотите перейти в каталог «Загрузки». Для этого вся команда:
Но даже если вы наберете:
Предполагая, что нет других каталогов, начинающихся с «Down-», Bash автоматически заполнит имя «Downloads» сразу после нажатия Tab. Все идет нормально. Но скажем, вы вводите только «D-» и нажимаете Tab. Что тогда? Предполагая, что у вас есть обычный домашний каталог, как минимум три каталога будут начинаться с буквы «D» — «Загрузки», «Рабочий стол» и «Документы». Итак, что делает Bash, так это показывает вам все варианты, которые начинаются с «D», и вы должны выбрать один и ввести его.
Автодополнение Bash
Так чем же отличается Zsh? В соответствии с целью сделать Zsh более интерактивным, он позволяет переключаться между всеми параметрами с помощью клавиши Tab и выбирать один, просто нажав клавишу Enter.
Это не ограничивается только автозаполнением имен файлов. Это относится и к различным командам. Например:
Команда убить
Одно блестящее использование этой функции можно увидеть с помощью убийство команда. убийство Команда используется, чтобы «убить» процесс в Linux. Любой процесс, отвечающий или не отвечающий, может быть удален с помощью этой команды. Вам нужно знать PID (идентификатор процесса) процесса, который вы хотите исключить. Например, если я хочу удалить открытый экземпляр Thunar, файловый менеджер. Для этого мне нужно знать PID Thunar. Это можно выяснить с помощью этой команды:
Итак, в этом случае:
Здесь первым результатом является фактический процесс. Вы заметите «grep» во втором процессе, который мы запустили. Это означает, что второй процесс просто ищет первый. Вы можете игнорировать последний в большинстве случаев.
Тунар PID
Это покажет мне PID. Теперь для устранения мне нужно использовать команду kill:
Итак, это становится:
Но Zsh значительно упрощает этот процесс. Просто введите убийство и продолжайте нажимать Tab, и Zsh позволит вам циклически проходить через запущенный процесс. Выберите один с помощью клавиши Enter и немедленно уничтожьте его.
Кто-то может возразить, что вы можете убить процесс напрямую, используя убить command, которая позволяет вам уничтожать команды, используя их имена. Итак, я мог ввести:
И Bash убьет все процессы, начинающиеся с «Thunar». Но проблема остается в том, что вы не всегда можете знать, как называется процесс, не поискав его заранее и не запомнив его. Цикл Zsh через все процессы делает его намного более управляемым.
Zsh убить команду
2. Оперативная настройка
Zsh предоставляет гораздо больше возможностей для оперативной настройки по сравнению с Bash. Например, вы можете представить относительно распространенную конфигурацию подсказки, используя это как PS1 переменная:
Это показывает подсказку как:
Zsh пример настройки подсказки
Ключевое заметное отличие от .bashrc заключается в том, что он использует символ амперцента «%» вместо обратной косой черты «\» для интеграции различных значений в подсказку. Символ «n» обозначает имя пользователя, а «m» — имя машины. Bash имеет ограниченное количество таких держателей переменных, но Zsh делает все возможное.
Параметры включают много информации об используемой системе контроля версий (например, Git) (подробнее об этом здесь ), номер используемого токена истории, количество заданий (фоновые процессы, преднамеренно запущенные пользователем) и форматирование текста, такое как подчеркивание, полужирный шрифт и т. д., и даже условные строки. Вы можете найти информацию о множестве опций в их документации. здесь . У вас даже может быть разное отображение правой и левой сторон экрана; вот насколько настраиваемый Zsh.
Подсветка синтаксиса
Одной из основных конфигураций, предлагаемых Zsh, которая нравится пользователям, является подсветка синтаксиса. С помощью плагина (подробнее об этом позже) Zsh может подсвечивать синтаксис команд терминала по мере их ввода.
3. Автокоррекция
С этой проблемой пользователи сталкиваются довольно часто. Вы ошибочно вводите test.oy вместо тест.py, и команда не работает. Это не большая проблема, но, безусловно, сложно снова ввести или исправить команду. Zsh предлагает решение. Он использует автокоррекцию команд и имен файлов, если они введены немного неправильно. Например, если я пытаюсь создать каталог с именем зшаавтокоррект:
Но я «случайно» вхожу нкдир в месте мкдир:
Zsh Пример автозамены
Zsh предлагает исправление, которое вы можете решить сами.
4. Плагины
Наконец-то мы подошли к точке, где у Zsh гораздо больший потенциал, чем у Bash. Плагины.
Как вы, наверное, уже знаете, плагины — это небольшие программные компоненты, которые можно добавлять к существующему программному обеспечению для расширения его функциональности. Хотя Zsh уже предлагает гораздо больше, чем Bash с его текущим кодом, добавление плагинов может добавить функции, о которых вы даже не подозревали. Например, уже упомянутая подсветка синтаксиса. Кроме того, есть плагины для завершения на основе истории, автопредложений, связанных с Git и т. д. Плагины сосредоточены не только на функциях; есть даже те, которые сосредоточены на форме, как знаменитый уровень мощности10k тема .
Существует множество плагинов, которые вы можете искать и открывать вручную. Если установка, удаление и управление многими вещами кажутся пугающими, не беспокойтесь, потому что сообщество все еще поддерживает вас. Для Zsh также доступны менеджеры плагинов. И эй, если вы не хотите получать плагины по одному, вы даже можете использовать скрипты, которые установят набор плагинов и в целом дадут вам отличный опыт. Это подводит нас к нашей следующей подтеме.
О, мой ЗШ
Нельзя говорить о Зш, не упомянув О, мой ЗШ.
Zsh великолепен и расширяем, но иногда люди не хотят тратить много времени на выяснение отличной конфигурации. Нам нужна предварительно настроенная структура настроек и расширений, которая может добавлять функциональность без особых хлопот. О, мой ЗШ имеет более 275 плагинов, которые делают вашу подсказку Zsh настолько обширной, насколько это возможно. Если вы серьезно рассматриваете возможность воспользоваться всеми преимуществами Zsh, возможно, О, мой ЗШ для вас. В любом случае, вы можете попробовать и убедиться в этом сами.
О, мой Zsh Первый экран
Для установки нужен Git. Если он у вас еще не установлен, используйте менеджер пакетов по умолчанию, чтобы установить его. Например, в дистрибутивах на основе Ubuntu и Debian команда будет выглядеть так:
Теперь, чтобы установить Oh My Zsh, введите:
О, моя установка Zsh
Если вам не нравится, как это выглядит, удалите Oh My Zsh, просто выполнив эту команду в командной строке Zsh:
5. Арифметика с плавающей запятой
Одним из основных недостатков Bash является то, что вы не можете выполнять арифметические операции с плавающей запятой с помощью встроенных команд. Хотя вы можете сделать это с помощью внешней команды до н.э., что плохо работает в долгосрочных или сложных сценариях. Например, здесь:
Bash Арифметика с плавающей запятой
Но Zsh, с другой стороны, может (более или менее) иметь дело с арифметикой с плавающей запятой:
Zsh Арифметика с плавающей запятой
Это значительный выигрыш, если вам часто приходится работать с числами и использовать их в повседневной работе.
6. Установка
Хотя Zsh используется по умолчанию в Mac OS и Kali Linux, он не предустановлен в большинстве дистрибутивов Linux. Чтобы установить ЗШ:
Debian, Ubuntu и их производные
Простая команда установки должна сделать:
Установка ЗШ
Fedora и производные
Эквивалент предыдущей команды в DNF:
Арка и производные
Другие дистрибутивы
Нет централизованной страницы с инструкциями по установке, но простой поиск в Интернете должен дать вам подробную информацию.
Конфигурация
Первое, что вам нужно (необязательно) сделать после установки Zsh, это настроить его. Вас встретит такой экран:
ЗШ Первый Старт
Если вы хотите настроить мелкие детали самостоятельно, выберите вариант 1. Вам будет представлено другое меню с несколькими подменю. Вы сможете контролировать такие детали, как история, завершение, привязки клавиш, некоторые параметры бинарной оболочки и т. д.
Меню конфигурации Zsh
Мы не рекомендуем использовать вариант 0 с наличием чего-либо в файле конфигурации, потому что это оставит вас с монотонной подсказкой. Если вы не хотите вдаваться в подробности при настройке, лучше выберите вариант 2.
Настройка по умолчанию
Теперь, когда вы увидели, что Zsh может предложить по сравнению с Bash, вы можете перейти на Zsh в качестве оболочки по умолчанию, если хотите, чтобы она осталась. Это не так уж важно, и это не повредит вашей системе, так что вы можете выбросить эту мысль из головы. Это довольно простая команда:
Команда зш получает местоположение исполняемого файла для Zsh, который затем устанавливается в качестве местоположения для новой оболочки по умолчанию. Он запросит у вас пароль, и все. Теперь вы официально являетесь пользователем Zsh.
Изменение оболочки по умолчанию
Вывод
Поработав некоторое время с Linux, пользователи склонны немного экспериментировать, и Zsh — прекрасный пример того, почему это здорово. Zsh добавляет некоторые функции, которые прекрасно выполнены и высоко оценены большинством пользователей. Поэтому он должен был завоевать ту популярность, которую он получает сейчас. Zsh имеет еще больше возможностей по сравнению с Bash, таких как расширенная подстановка, другая конфигурация файлов запуска и т. д. Мы рекомендуем вам изучить эти различия, если вы собираетесь использовать Zsh. Мы надеемся, что эта статья была вам полезна. Ваше здоровье!