LINUX.ORG.RU

В чём различие между fish, zsh, bash и других?

 , , , ,


0

1

Доброго времени суток! Хотелось бы узнать в чем разница между оболочками. Какую из них стоит юзать и почему? Желательно привести аргументы за и против. Ещё хотелось бы узнать где это применяется. Я знаю что bash используется для написания скриптов так что могу предположить что и остальные тоже. Можете подробнее объяснить новичку?

P.S: Я знаю что вопрос глупый, но что поделаешь если я об этом почти ничего не знаю? Приходиться спрашивать у более опытных людей.


Доброго времени суток!

Не пиши так, это фраза для идиотов.

Хотелось бы узнать в чем разница между оболочками. Какую из них стоит юзать и почему?

bash это дефолтная интерактивная оболочка практически во всех линукс-дистрах, поэтому лучше привыкнуть к ней, чтоб везде было удобно без лишней возни. fish и zsh это какие-то модные нестандартные шеллы, может их поизучать если нечем заняться, но учти что их почти нигде нет.

Я знаю что bash используется для написания скриптов

Нет. Скрипты пишутся а posix шелле (/bin/sh), по крайней мере у нормальных людей. На баше пишут нубы которые думают что /bin/sh это и есть баш. Все остальные оболочки применяются как интерактивные шеллы.

firkax ★★★★★
()

Bash — самый распространённый, по историческим причинам.

Zsh — совместим с Bash, по сути то же самое, но чуть-чуть более фичастый и гибкий.

Fish — NIH-оболочка для тех, кто не осилил Bash и Zsh. Имеет несколько более приятный, но ни с чем не совместимый, а от того не нужный синтаксис.

Скрипты лучше писать на POSIX Shell. Тогда неважно, чем их будет запускать юзер: bash, zsh, dash или busybox’овским встроенным. Это несложно на самом деле.

В интерактиве юзать — Bash или Zsh по вкусу. Zsh объективно технически фичастее, но Bash популярнее, поэтому если прыгать с сервера на сервер туда-сюда, то кому-то удобнее использовать более «стандартное». При правильной настройке под свои нужды отличия для большинства юзеров минимальные. Хотя есть некоторые приятные фичи, которых в случае привыкания потом не хватает в Bash и без костылей не настроить.

Fish можно юзать, если очень хочется быть «не таким как все», или если очень сильно воротит от синтаксиса POSIX Shell вместе с Bash и Zsh.

// сам юзаю zsh, но какая, в принципе тебе разница: попробуй сам да выбери.

P.S. Переходит «с/на» и «между» Bash и Zsh очень легко в целом. Можно использовать и то и другое. В том числе zsh на десктопе и bash на серверах (если лень или почему-то нет возможности поставить zsh, хотя часто он таки есть по умолчанию). Синтаксис там по сути одинаковый (для чего разный — особо продвинутые фичи, и их можно просто не юзать там, где их нет, это никакого дискомфорта не доставляет). Различия больше в интерактиве.

Ну и люблю я zshell’овский сокращённый for юзать. Не в скриптах, конечно, но очень удобно. Стандартный «башевский», естественно тоже работает.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)

bash - базовая оболочка, zsh и fish предоставляют дополнительные возможности. Например показ в статусе текущей ветки git и кода возврата предыдущей команды, автодополнение команд по истории (самая удобная фича), разнообразные подсветки синтаксиса, алиасы и т.п.

В fish самые популярные фичи есть из коробки и их не надо настраивать. Однако сторонних плагинов не очень много, а синтаксис не совместим с bash.

В zsh (кстати оно идет по умолчанию в macos) куча сторонних плагинов и синтаксис совместим с bash, но все это хозяйство надо настраивать. Лично я советую не соваться в https://ohmyz.sh/, а начать с https://github.com/sorin-ionescu/prezto - ставишь и получаешь из коробки все самые популярные плагины, почти как в fish.

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)
Ответ на: комментарий от firkax

Скрипты пишутся а posix шелле (/bin/sh),

Я стесняюсь спросить, сколько твоих скриптов на /bin/sh есть в реальных продуктах, а не на локалхосте?

zolden ★★★★★
()
Ответ на: комментарий от Lrrr

zsh и fish предоставляют дополнительные возможности. Например показ в статусе текущей ветки git и кода возврата предыдущей команды, автодополнение команд по истории (самая удобная фича), разнообразные подсветки синтаксиса, алиасы и т.п.

Почти всё что ты перечислил, есть в bash.

Gary ★★★★★
()
Ответ на: комментарий от firkax

На баше пишут нубы которые думают что /bin/sh это и есть баш

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb  2 09:38 /bin/sh -> bash
dmitry237 ★★★
()
Последнее исправление: dmitry237 (всего исправлений: 1)
Ответ на: комментарий от dmitry237

Да, этот симлинк во многих линуксах (впрочем, с тех пор как в дебиане сделали dash, доля дистров с таким симлинком очень сократилась) - наверно основная причина этого заблуждения у новичков. Но надо всё-таки не забыть и башевский ман (раздел INVOCATION) почитать, так вполне расписано почему такой /bin/sh всё же совсем не то же самое, что баш. Хотя, конечно, эта абстракция местами протекает, что тоже способствует (ну, сейчас, после dash, уже заметно меньше) неправильным скриптам.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Скрипты пишутся а posix шелле (/bin/sh), по крайней мере у нормальных людей. На баше пишут нубы которые думают что /bin/sh это и есть баш.

Это слишком упрощенное видение ситуации (или слишком радикальное разделение людей на нормальных и уттерменшей). Например, в баше есть встроенные возможности для работы со строками и массивами, позволяющие сделать код если не удобочитаемым, то хотя бы не настолько тормозным и неподдерживаемым. Я лично склоняюсь к тому, что если в коде понадобились башизмы, то надо менять ЯП, но эту точку зрения разделяют не все.

annulen ★★★★★
()

Баш:
Bash — это оболочка по умолчанию в большинстве дистрибутивов Linux и macOS.
Он существует уже давно и широко используется, поэтому существует большое сообщество пользователей и множество ресурсов, доступных в Интернете.
Bash обладает широкими возможностями настройки и поддерживает сценарии, что делает его хорошим выбором для системных администраторов, разработчиков и опытных пользователей.
У него крутая кривая обучения, а его синтаксис может быть трудным для чтения и записи.

Рыба:
Fish — это современная оболочка с упором на простоту и удобство использования.
Он имеет более удобный синтаксис, чем bash, с такими функциями, как автозаполнение, подсветка синтаксиса и предложения.
Fish имеет меньшую пользовательскую базу, чем bash, поэтому в Интернете доступно меньше ресурсов, и он может быть не установлен по умолчанию на некоторых системах.
Это хороший выбор для начинающих, веб-разработчиков и всех, кто хочет более оптимизированную и интуитивно понятную оболочку.

ЗШ:
Zsh — это настраиваемая оболочка с множеством дополнительных функций.
Он имеет более читаемый и интуитивно понятный синтаксис, чем bash, с поддержкой подстановки, поиска в истории и исправления орфографии.
Zsh имеет большое сообщество пользователей и множество доступных плагинов и тем, что делает его хорошим выбором для опытных пользователей и разработчиков.
В некоторых системах он может быть не установлен по умолчанию, и его конфигурация может быть сложной.

Что касается того, какая оболочка лучше для какого случая использования, это зависит от индивидуальных потребностей и предпочтений. Вот несколько общих рекомендаций:

Если вы системный администратор или разработчик, которому нужна настраиваемая оболочка с надежными возможностями сценариев, лучшим выбором может быть bash или zsh.
Если вы новичок или случайный пользователь, который хочет более удобную и интуитивно понятную оболочку, рыба может быть лучшим выбором.
Если вы ищете оболочку с определенной функцией или функциями, вы можете изучить, какая оболочка обеспечивает наилучшую поддержку этой функции.

В конечном итоге все три снаряда дееспособны и могут использоваться для решения широкого круга задач. Лучшая оболочка для вас будет зависеть от ваших конкретных потребностей и предпочтений.

slowpony ★★★★★
()
Ответ на: комментарий от dmitry237

Не морочь людям головы.

Script started on 2023-02-28 15:50:39+00:00 [TERM="linux" TTY="/dev/console" COLUMNS="240" LINES="67"]


BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) ESC[6nstat /bin/sh
  File: /bin/sh
  Size: 317704    	Blocks: 624        IO Block: 4096   regular file
Device: 2h/2d	Inode: 274         Links: 94
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/ UNKNOWN)
Access: 2023-02-28 15:50:39.000000000
Modify: 2022-02-04 22:10:23.000000000
Change: 2023-02-28 15:33:17.000000000

(initramfs) ESC[6nexit

Script done on 2023-02-28 15:51:02+00:00 [COMMAND_EXIT_CODE="0"]
cyberping
()
Ответ на: комментарий от annulen

sh + textutils

Мне проще сразу на перл перейти, чем возиться с такими штуками.

Бывают простые задачи, где perl еще избыточен, а голого sh не хватает.

sh + textutils здесь имеют плюс в том, что их можно применять интерактивно для однострочников и для простых скриптов тоже. Perl в качестве интерактивного шелла не видел.

P.S. видел интерпретируемый C++ как интерактивный шелл, впрочем.

x22
()
Ответ на: комментарий от x22

Perl в качестве интерактивного шелла не видел.

Но у него есть куча плюшек для однострочников при вызове из-под другого шелла. Хотя были и интерактивные варианты, но это экзотика.

Бывают простые задачи, где perl еще избыточен, а голого sh не хватает.

Через бэктики можно втыкать в perl целые пайплайны из команд. Два символа - это недорогая цена.

annulen ★★★★★
()
Ответ на: комментарий от pfg

перл прикольный а для текста вообще офигенный

И имеет много общих черт в синтаксисе, упрощающи портирование не очень сложных скриптов: переменные с такими же сигилами, подстановки работают примерно так же, к функциям достаточно добавить sub, shift для аргументов работает так же, $? на месте, и т.д. и т.п.

annulen ★★★★★
()

У fish ещё есть такая уникальная фича - генерация автодополнений из man`ов.

То есть, если для программы нет автодополнений «из коробки», но есть man(s), то после выполнения $ fish_update_completions они появятся.

dataman ★★★★
()

На самом деле не понимаю смысла в bash, скрипты писать на нём не стоит, использовать в качестве оболочки дольше 10 минут - боль и страдания по сравнению с современными шеллами. Уверен, что все кто говорят об обратном - пользователи хакер-утилит ping и top.

[/holy-war-mode]

ddidwyll ★★★★
()
Ответ на: комментарий от dataman

это конечно интересно. Но не всегда полезно. Автодополнение чисто по опциям командной строки может быть полезно в некоторых случаях, но не всегда. Зачастую полезнее такие дополнения как например имя ветки для git или имя юнита для systemctl.

И вот тут проявляет себя главная проблема fish - он не подхватывает автодополнения от bash или zsh. Если для конкретной команды нет скрипта автодополнения - то ты ограничен либо базовым автодополнением по ману, либо вообще отсутствием автодополнения - наверняка не любой ман он сможет распарсить и правильно интерпретировать.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от annulen

Но у него есть куча плюшек для однострочников при вызове из-под другого шелла. Хотя были и интерактивные варианты, но это экзотика.

Так и есть, в большинстве разовых задач хватит sh + {grep,sed,sort,…,perl}.

Через бэктики можно втыкать в perl целые пайплайны из команд.

Если для хранения/преобразования данных нужны структуры, а не просто строки, тогда да.

x22
()
Ответ на: комментарий от ddidwyll

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

annulen ★★★★★
()
Ответ на: комментарий от targitaj

У баша в режиме sh остается поддержка ряда расширений, если скрипт работает под /bin/sh -> bash это не гарантирует его работу с другими POSIX-совместимыми шеллами.

annulen ★★★★★
()
Ответ на: комментарий от targitaj

Благо что на свете есть shellcheck, который может проверить совместимость и показать на возможные ошибки. Без него вообще не стоило бы что-то сложнее нескольких строк с вызовами команд на шелле писать.

annulen ★★★★★
()

Недавно перешёл на рыбу, ибо есть автокомплит и другие фичи.

По-нубски воспринимаю bash как ЯП, а fish как улучшалку для терминала. Хотя знаю, что тут всё немного сложнее)

Кстати, сталкивался кто-нибудь с таким в fish? Запускаешь скрипт, тот выводит какую-то инфу, завершается, а снизу нет user@host и строки ввода. При этом команду ввести можно, но она отображается как-то странно, не с новой строки. Вообще тут скрин нужен, но сейчас повторить не могу)

el-d ★★
()
Ответ на: комментарий от el-d

Недавно перешёл на рыбу, ибо есть автокомплит и другие фичи.

Автокомплит и в баше есть. Некоторые штуки, например автокомплит и PS1 для git, может понадобиться включать явно.

annulen ★★★★★
()

Я чот представляю, что это @Original_1 зарегал виртуала, чтобы доказать всем, что здесь мрачные люди с «постсоветским менталитетом» плотно напихивают в панамку новичкам с их дебильными вопросами.

А ему все не напихивают и не напихивают.

Вот же незадача.

thesis ★★★★★
()
Ответ на: комментарий от mord0d

bash –posix

Агада, как же!

Таки да. У меня ‘bash –posix’ никогда не выявлял башизмы. Впрочем, выполнение c ksh/dash/ash тоже не выявляло shell-специфических ошибок. Возможно, интуитивно использовал подмножество всех этих *sh.

Чаще попадал на расширения GNU sed, grep,… по сравнению с POSIX.

x22
()
Ответ на: комментарий от cyberping

Не морочь людям головы.

Я тоже могу показать stat:

$ stat /bin/sh
  File: /bin/sh -> bash
  Size: 4         	Blocks: 0          IO Block: 4096   symbolic link
Device: 259,2	Inode: 24124394    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-02-27 10:37:20.446666627 +0300
Modify: 2023-02-02 09:38:44.000000000 +0300
Change: 2023-02-22 11:49:21.453272401 +0300
 Birth: 2023-02-22 11:49:21.453272401 +0300

$ file /bin/sh
/bin/sh: symbolic link to bash

dmitry237 ★★★
()
Ответ на: комментарий от dmitry237
$ stat /bin/sh
  Файл: /bin/sh -> dash
  Размер: 4         	Блоков: 0          Блок В/В: 4096   символьная ссылка
Устройство: 805h/2053d	Инода: 394662      Ссылки: 1
Доступ: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Доступ:        2023-02-28 09:25:02.771998161 +0300
Модифицирован: 2022-08-21 21:30:58.671062945 +0300
Изменён:       2022-08-21 21:30:58.671062945 +0300
Создан:        2022-08-21 21:30:58.671062945 +0300

Как видишь bash далеко не везде, по умолчанию.

cyberping
()