Обзор-сравнение командных оболочек (unix shell): BASH, ZSH, FISH. Linux статьи
Написать статью
Войдите, чтобы писать статьи

Обзор-сравнение командных оболочек (unix shell): BASH, ZSH, FISH

37

BASH, ZSH, FISH

Материал написан пользователем сайта.

Коротко о Unix Shell

Unix shell — это оболочка (интерпретатор команд), предоставляющая пользовательский интерфейс командной строки для Unix подобных операционных систем. Оболочка одновременно является языком интерактивных команд и языком сценариев (скриптов) и используется пользователем для передачи команд (списка команд) операционной системе.

BASH — Bourne Again SHell

Название BASH происходит от "Bourne again shell" (еще одна командная оболочка Борна). Появилась в 1987 году, как усовершенствованный вариант командной оболочки Bourne shell (sh, автор Стивен Борн). Поскольку фамилия Bourne (Борн) созвучна со словом born (рожденный), появился каламбур "Born again shell" (рожденная вновь командная оболочка).

BASH, как и все shell, представляет собой командный процессор, работающий в текстовом окне в интерактивном режиме. Поддерживает различные сокращения и переменные, операторы цикла, контроль и подстановку вывода результатов, автодополнение имен файлов и каталогов. Синтаксис BASH и другие особенности языка были заимствованы его автором Брайаном Фоксом из SH.

BASH — одна из первых программ, которую Линус Торвальдс (создатель Linux) портировал на Linux. BASH — самая распространенная оболочка Linux и каждый пользователь, который хоть раз открывал терминал, взаимодействовал с ней.

Ключевые особенности BASH:

  1. Огромное количество пользователей используют BASH, так как эта оболочка установлена по умолчанию в большинстве систем Linux
  2. Командный процессор BASH имеет множество встроенных команд
  3. BASH не имеет встроенного выражения с подстановочными знаками (*,?,[]), которые используются для поиска шаблонов, аналогично регулярному выражению
  4. Символ # рассматривается как комментарий в сценарии BASH
  5. Имеет крайне скромные (ограниченные возможности) настройки
  6. Пользовательские параметры конфигурации находятся в домашнем разделе в файле /home/.bashrc
ZSH — Z SHell

Первая версия ZSH была написана Паулем Фалстадом, когда он был студентом Принстонского университета в 1990 году. Название оболочки произошло от учетной записи "zsh" университетского ассистента Пауля по имени Чжун Шао. В настоящее время проект развивается энтузиастами под руководством Питера Стефенсона в рамках свободно распространяемого ПО.

ZSH является расширенным аналогом BASH и имеет с ним обратную совместимость, добавляя ему большое количество улучшений.

Ключевые особенности ZSH:

  1. Встроенное автозаполнение с расширенным функционалом. Клавиша TAB используется для автоматического дополнения (завершения) любой команды, которую вы хотите запустить. Помимо автозаполнения она выводит раскрывающийся список всех возможных файлов и каталогов
  2. Поддерживает встроенные выражения с подстановочными знаками (*, ?, [])
  3. Более настраиваемый, чем BASH
  4. Поддерживает различные плагины, расширяющие функционал и темы для кастомизации внешнего вида.
  5. Oh My Zsh — наиболее известный фреймворк для применения разнообразных настроек оболочки
  6. Пользовательские параметры конфигурации находятся в домашнем разделе в файле /home/.zshrc
FISH — Friendly Interactive SHell

FISH — это POSIX несовместимая оболочка UNIX с упором на интерактивность и удобство использования, была создана Акселем Лильенкранцем в 2005 году. POSIX (Portable Operating System Interface) — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой (системный API), библиотеку языка "C" и набор приложений и их интерфейсов.

В отличие от других оболочек, которым требуется много настроек и дополнительных плагинов, FISH предлагает все удобства пользователю прямо "из коробки". В то же время FISH является самой нестандартной оболочкой из-за того, что она не соответствует POSIX.

Синтаксис в FISH также изменен в сторону упрощения командного языка оболочки, например все управляющие конструкции завершаются ключевым выражением "end". Еще одним нововведением FISH являются универсальные переменные, вводимые с помощью конструкции "set -U переменная значение".

Ключевые особенности FISH:

  1. FISH предлагает автоматический «поиск во время ввода», основанный на  истории команд и каталоге, в котором вы находитесь на момент ввода
  2. Встроенная подсветка синтаксиса — это функция, которую мы все хотели бы иметь в интерфейсе командной строки. Это делает работу проще и удобней, экономит много времени. И все это предлагается пользователю прямо «из коробки», интерфейс выглядит красиво и интуитивно понятно
  3. FISH умеет анализировать справочные страницы MAN и преобразовывать их в табличный формат вывода с удобным перемещением между данными
  4. Настройки FISH очень просты и понятны. Для изменения внешнего вида достаточно набрать в окне терминала команду: «fish_config», — откроется веб-сервис настроек, с возможностью выбора уже готовой предустановки, либо любой пользовательской конфигурации
  5. Дополнительно для расширения возможностей и настроек кастомизации FISH предлагается фреймворк Oh My Fish, аналогичный таковому в ZSH
  6. FISH предлагает очень простой и интуитивно понятный интерфейс командной строки для любого пользователя любого уровня. Для вызова справки по командному процессору FISH нужно просто набрать «help» в окне терминала, — откроется веб-сервис с удобно организованной и хорошо наполненной интерактивной базой знаний, в которой точно «найдется все»
  7. Пользовательские параметры конфигурации находятся в домашнем разделе в файле /home/.config/fish/config.fish

Демонстрация особенностей

Демонстрация автозаполнения
Разница в синтаксисе

Выводы

  1. BASH, ZSH и FISH имеют свои достоинства и недостатки, а также некоторые сходства между собой
  2. Если вы консерватор и приверженец всего классического, вы просто можете оставить себе BASH
  3. Если вы хотите что-то более гибкое и настраиваемое, вы можете попробовать ZSH, дополнив его плагинами или даже установив Oh My Zsh
  4. Если вам нужен интерактивный терминал без особых настроек, вы можете смело использовать FISH. Даже если он и не лучший во всем, FISH имеет функциональные возможности, соответствующие основной философии UNIX: «Do one thing, and do it well” (делай что-то одно и делай это хорошо)

Вместо послесловия

Если спросить мое личное мнение, то я предложу FISH, несмотря на то, что сам использую ZSH :)

Лайков: +21
войдите, чтобы ставить лайки
37
  • Опубликовано: 11.04.2023
  • scorpii

Комментарии

LactoseFree1
Активный пользователь
Активный
11.04.2023
13:47
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+3
войдите, чтобы ставить лайки
>> то я предложу FISH, несмотря на то, что сам использую ZSH :)

Аналогично))
Minor748
Активный пользователь
Активный
11.04.2023
14:37
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Благодарю. Теперь и этот вопрос можно считать закрытым. Сам бы я не добрёл до этого.

П.С. Обычно во всех дистрибутивах .bashrc чем-то наполнен, а вот в кальке он пустой был изначально. Вписал туда "neofetch" и алиасы всякие. Они, кстати, в других shell поддерживаются?
scorpii
Активный пользователь
Активный
11.04.2023
15:05
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийMinor748Родительский комментарий
+1
войдите, чтобы ставить лайки
С aliases в posix-совместимых разницы в работе нет.
Для fish придется создавать свои, справка вызывается командой alias -h
или искать пути (скрипты), как заставить fish использовать псевдонимы bash.

Правда есть более простой способ использовать псевдонимы bash в fish (возможно специфические и не заработают, не проверял). Для этого все пользовательские сокращения нужно сохранить в отдельный файл,
например ~/.my_aliases
Далее в файл конфига fish (~/.config/fish/config.fish) нужно добавить строку:
source ~/.my_aliases
igorborisov
Активный пользователь
Активный
11.04.2023
18:03
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийMinor748Родительский комментарий
0
войдите, чтобы ставить лайки
В кальке конфиги от разработчиков самого софта, а не от разработчиков дистрибутива. А вообще - в кальке все есть - пишите сами, присылайте патчи (или это так про *BSD говорили)...
Rom
Активный пользователь
Активный
11.04.2023
15:17
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Использую bash. Значимых лично для себя преимуществ между ними не заметил
igorborisov
Активный пользователь
Активный
11.04.2023
18:04
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийRomРодительский комментарий
+3
войдите, чтобы ставить лайки
А вы посидите по 8 часов день в терминале, и заметите разницу даже между настроенным и ненастроенным bash.
Rom
Активный пользователь
Активный
11.04.2023
18:13
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийigorborisovРодительский комментарий
+1
войдите, чтобы ставить лайки
Bach использую не постоянно, для текущих задач мне его хватает в том виде как есть.
scorpii
Активный пользователь
Активный
11.04.2023
18:16
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийRomРодительский комментарий
+1
войдите, чтобы ставить лайки
Ради интереса попробуйте fish
Rom
Активный пользователь
Активный
11.04.2023
18:20
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
0
войдите, чтобы ставить лайки
Попробую, но времени на все не хватает. Скрипты пишу только для настройки операционки под себя. Сейчас в приоритете другие задачи.
xKDE
Активный пользователь
Активный
11.04.2023
15:26
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
>> "BASH не имеет встроенного выражения с подстановочными знаками (*,?,[]), которые используются для поиска шаблонов, аналогично регулярному выражению"

Что подразумевает? У меня bash с подстановочными работает...
Например:
touch {a,b,c}{1,2,3}00{a,b,c} #создаст 27 файлов
echo a{1,2}* # выведет 6, соответствующих маске
Или я что-то не верно понял...
scorpii
Активный пользователь
Активный
11.04.2023
16:11
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийxKDEРодительский комментарий
0
войдите, чтобы ставить лайки
нет, имелось в виду, поиск с использованием шаблонов
например .* - в zsh и fish выдаст имя каталога в домашней директории, начинающегося с ".",
bash выдаст ошибку
xKDE
Активный пользователь
Активный
11.04.2023
16:49
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
0
войдите, чтобы ставить лайки
Если набрать:
.*
и нажать TAB (раз или два, в зависимости как настроено) - выдаст все скрытые каталоги, как и должно.
scorpii
Активный пользователь
Активный
11.04.2023
16:53
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийxKDEРодительский комментарий
0
войдите, чтобы ставить лайки
да, но это ж bash с плагином так выдает
имелось в виду, что в zsh автодополнение уже встроено, а в fish и подсветка синтаксиса встроена вдобавок
xKDE
Активный пользователь
Активный
11.04.2023
17:11
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
+1
войдите, чтобы ставить лайки
Вроде как в стоке умеет. Bash-completion нужен для команд и аргументов, это да.
scorpii
Активный пользователь
Активный
11.04.2023
17:16
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийxKDEРодительский комментарий
0
войдите, чтобы ставить лайки
сейчас проверил, они все по-разному работают с такими шаблонами
zsh при наборе в домашнем первой буквы каталога "Видео": В* - сразу переходит в этот каталог
остальные так не делают
xKDE
Активный пользователь
Активный
11.04.2023
17:27
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
+4
войдите, чтобы ставить лайки
Если это единственный каталог в текущей директории на "В", то bash развернет это до "Видео" и будет ждать, что Вы дальше с этой информацией будете делать. Но если дать "cd В*", то уйдет сразу в "Видео".
P.S.: я собственно, к тому, что возможностями оболочки мы не пользуемся в должной мере. А так - кому что на глаз интереснее))) За обзор + и спасTAB!)
scorpii
Активный пользователь
Активный
11.04.2023
17:30
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+3
войдите, чтобы ставить лайки
если кому интересно, каким образом в заголовке терминала прописать адрес (меняется автоматически при перемещении по каталогам) и через двоеточие после него название оболочки:

fish в его конфиг (~.config/fish/config.fish) добаить функцию:
function fish_title
set -q argv[1]; or set argv fish
echo (fish_prompt_pwd_dir_length=1 prompt_pwd): $argv;
end

для bash в его конфиг (~.bashrc):
case ${TERM} in
xterm*|rxvt*|Eterm*|aterm|kterm|gnome*|interix|konsole*)
PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/\~}: bash\007"'
;;
#строка приветствия - может быть любая на ваш выбор
screen*)
PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\033\\"'
;;
esac

для zsh в его конфиг (у меня /usr/share/zsh/manjaro-zsh-config):
ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<"
ZSH_THEME_TERM_TITLE_IDLE="%~: zsh"
igorborisov
Активный пользователь
Активный
11.04.2023
18:07
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
0
войдите, чтобы ставить лайки
Громоздко конечно, но это же шелл-скрипты. А без строчки ниже не работает?
xterm*|rxvt*|Eterm*|aterm|kterm|gnome*|interix|konsole*)
scorpii
Активный пользователь
Активный
11.04.2023
18:13
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийigorborisovРодительский комментарий
+1
войдите, чтобы ставить лайки
не проверял, по идее не должен, ведь это же не комментарий, начинающийся с #
p/s/ проверил - синтаксическая ошибка - типа не определено к чему относится "PROMPT_COMMAND"
в титуле терминала стандартный вывод пользователь-хост
Minor748
Активный пользователь
Активный
10.05.2024
18:54
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
+1
войдите, чтобы ставить лайки
Перешёл сегодня на zsh. В первую очередь разобрался как раскрасить имя пользователя/хоста, остальное уже по ходу настрою, если понадобиться. По умолчанию тоже включил, вместо родного bash

PROMPT='%F{2}%n%F{4}@%F{5}%m%f%F{4} $%'

https://wiki.archlinux.org/title/Zsh_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%A6%D0%B2%D0%B5%D1%82%D0%B0

Кстати, а куда история сохраняется? Я понял, что это там настраивается где-то. Создал в хомяке файл .zshrc и туда алиасы перенёс из .bashrc. Где её искать, если что?
scorpii
Активный пользователь
Активный
10.05.2024
19:02
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийMinor748Родительский комментарий
0
войдите, чтобы ставить лайки
А я в последнее время использую связку bash + fish
Fish хорош тем, что его настраивать не нужно, все есть и работает из коробки. Bash - классика иногда очень нужная с точки зрения posix совместимости
xKDE
Активный пользователь
Активный
10.05.2024
19:06
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийMinor748Родительский комментарий
+1
войдите, чтобы ставить лайки
Куда пропишите. По дефолту вроде как ~/.zsh_history, задаётся указанием:
export HISTFILE=<<путь>>
Суп-набор по истории:
export HISTSIZE=1000
export SAVEHIST=$HISTSIZE
setopt APPEND_HISTORY
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_REDUCE_BLANKS
Но bash, конечно, в этом плане мощнее, имхо.
Minor748
Активный пользователь
Активный
10.05.2024
20:44
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийxKDEРодительский комментарий
0
войдите, чтобы ставить лайки
Казалось бы, так схожи bash и zsh, брат помладше: до файла .zshrc я допёр, туда алиасы перенёс, они заработали, а вот до zsh_history уже нет, не создавал. Но в настройках (в хелпе) заметил, что файл истории нужно отдельно прописывать в файл, цвета опять же задал по той статье выше, на этом сайте нашёл статью как выбрать по умолчанию sh (работает после релогина).

Силушки уже да и голова весь день вялотекуще побаливает. Но вот всё остальное надо по настройкам тыкать, даже самые мелочи в виде сочетаний клавиш для перескакивания через слова.
igorborisov
Активный пользователь
Активный
11.04.2023
18:00
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Для скриптов использую bash, для всего остального - fish. Радует zsh по умолчанию в kali/manjaro, но на нем долго не задерживаюсь, ставя fish.
Hargard
Активный пользователь
Активный
11.04.2023
22:08
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийigorborisovРодительский комментарий
+3
войдите, чтобы ставить лайки
Кстаати, про ублюдскую цветотему, оформление и иконки zsh в Manjaro.
Просто введи "p10k configure" в консоли и выбирай в мастере наиболее приглянувшиеся варианты оформления.
igorborisov
Активный пользователь
Активный
12.04.2023
09:25
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийHargardРодительский комментарий
0
войдите, чтобы ставить лайки
Попробуем
PedroAmor
Активный пользователь
Активный
11.04.2023
21:55
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Спасибки, за демонстрацию особо, надо ZSH и FISH пощупать, подсказки лишними не бывают.
BassUtter
Активный пользователь
Активный
11.04.2023
22:35
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+2
войдите, чтобы ставить лайки
Автору большое спасибо за интересную статью. Пробовал все, Zsh использую сейчас.
Sergejs
Активный пользователь
Активный
12.04.2023
00:07
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
Насчёт Oh my Zsh там если мне не изменяет память в папке плагины есть плагины alias команд для разных дистрибутивов,нужно только название дистрибутива вписать в строку плагнов в zshrc
choice
Активный пользователь
Активный
12.04.2023
16:57
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+2
войдите, чтобы ставить лайки
Спасибо за разбор темы, а демонстрация - просто обалдеть.
Всякие gui множатся, но и в терминале может быть удобнее.
igorborisov
Активный пользователь
Активный
12.04.2023
17:17
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийchoiceРодительский комментарий
0
войдите, чтобы ставить лайки
Удобнее чем где? %-)
nyptus
Активный пользователь
Активный
21.04.2023
09:36
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийigorborisovРодительский комментарий
0
войдите, чтобы ставить лайки
Чем везде! :)
evgnor86
Активный пользователь
Активный
12.04.2023
17:34
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Попробовал посидеть на zsh все как-то вычурно))) вернулся на родной bash
LexD
Активный пользователь
Активный
15.04.2023
11:31
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Познавательно. Установлен bash (пытаюсь тыкать), zsh (не настраивал). Про fish впервые слышу.
Linuxold
15.04.2023
21:32
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
позновательно но сижу только на bash и доволен
[аноним]
02.05.2023
11:59
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Очень доступно и лаконично написано, спасибо за статью
Nobody
07.05.2023
10:53
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
А как же PWSH?

Написать комментарий

Ваше имя:
Текст комментария:
  • Уважать других.
  • Не ругаться.
  • Без оскорблений.
  • Без грубости.
  • Не переходить на личности.
  • Писать на русском языке.
  • Без политики.
  • Без флуда.
Правила