Почему Fish лучше Zsh и уж тем более Bash — Пермяк на Неве
На главную

Почему Fish лучше Zsh и уж тем более Bash

Почему Fish лучше Zsh и уж тем более Bash

Короче, я хочу рассказать вам про Fish. Не про рыбу, а про шелл. Командную оболочку, в которой я сижу уже прилично времени и с которой у меня, кажется, самые здоровые отношения из всех, что были в моей жизни. Включая отношения с людьми.

Как я докатился до жизни такой

Предыстория такая. Я, как и все нормальные люди, долго сидел на Bash. Ну потому что он просто есть. Открываешь терминал — а там Bash. Как таракан на кухне: ты его не звал, но он тут живёт, и вроде не мешает. Потом в какой-то момент я узнал, что крутые ребята сидят на Zsh, и что там есть Oh My Zsh, и что с ним терминал становится красивым и модным. Ну ок, подумал я, давай попробуем.

И вот я потратил вечер на настройку Zsh. Потом ещё один вечер. Потом выходные. Я подбирал тему, я ставил плагины, я гуглил, почему у меня промпт рендерится полсекунды. Я добавил zsh-autosuggestions, zsh-syntax-highlighting, zsh-completions, ещё какую-то дичь, название которой уже не помню. Мой .zshrc разросся до двухсот строк, половину из которых я скопировал со Stack Overflow и боялся трогать, потому что один раз тронул — и у меня сломался SSH. Не спрашивайте как, я сам не понял.

Так вот, в какой-то момент я наткнулся на Fish. Friendly Interactive Shell. Название звучит как детский мультик, и я сначала не воспринял его всерьёз. Ну типа, что это за оболочка для дружелюбных? Мне не нужна дружелюбная оболочка. Мне нужна мощная оболочка. Я же серьёзный разработчик (нет).

Но я поставил. И у меня, простите за пафос, перевернулось представление о терминале.

Автодополнение, которое читает мысли

Открываю терминал. Начинаю печатать команду. И Fish мне сразу, прямо в строке ввода, серым текстом подсказывает продолжение. На основе моей истории команд. Я набираю git — а он уже предлагает git push origin main, потому что я это делал час назад. Стрелка вправо — и команда принята. Я не ставил никаких плагинов. Я не трогал никакой конфиг. Оно просто работает. Из коробки. Вот так. Ничего ж себе, подумал я.

Подсветка синтаксиса без плагинов

И подсветка синтаксиса тоже из коробки. Набираешь команду — она зелёная, значит существует. Красная — значит ты опечатался. Узнаёшь об ошибке до того, как нажал Enter. В Bash ты набираешь gti push, жмёшь Enter, получаешь command not found, чертыхаешься, исправляешь. В Fish ты видишь красный текст и исправляешь сразу. Мелочь, но за день набегает.

Скрипты для людей, а не для машин

Отдельная тема — скрипты. О, скрипты. Если вы когда-нибудь писали что-то сложнее однострочника в Bash, вы знаете это чувство. Это как разминировать бомбу, только бомба — это пробел внутри квадратных скобок. Вот смотрите, условие в Bash:

if [ "$var" = "value" ]; then
    echo "yes"
fi

Пробелы внутри скобок — обязательны. Убери один — и всё к чертям взрывается. Точка с запятой перед then — обязательна. Кавычки вокруг переменной — обязательны, потому что если переменная пустая, то без кавычек конструкция разваливается. Это не язык программирования. Это минное поле, притворяющееся языком программирования.

В Fish тот же код:

if test "$var" = "value"
    echo "yes"
end

Всё. Никаких then. Никаких fi. Никаких ;. Блок закрывается словом end. Всегда. Для ifend. Для forend. Для whileend. Для functionend. Не надо помнить, где fi, где done, где esac, где }. Одно слово на все случаи жизни. Когда я это осознал, я почувствовал, как из моих плеч ушло напряжение, которое копилось годами.

Универсальные переменные — скучное название, крутая штука

И вот ещё что. У Fish есть универсальные переменные. Звучит скучно, но на деле — магия. Пишешь set -U my_var hello в одном окне терминала — и переменная мгновенно появляется во всех остальных открытых терминалах. И сохраняется между перезагрузками. Без всяких export, без source ~/.bashrc, без перезапуска сессий. Просто работает. Я, конечно, понимаю, что «просто работает» — это скучный аргумент. Но чёрт возьми, после стольких лет ковыряния в конфигах это звучит как музыка.

Настройки в браузере (да, серьёзно)

А, и ещё. У Fish есть веб-конфигуратор. Набираешь fish_config — и в браузере открывается страница, где можно выбрать цветовую схему, поменять промпт, посмотреть все настроенные функции. Я понимаю, что для хардкорных линуксоидов это звучит как ересь. Настройки? В браузере? Что дальше, GUI для grep? Но знаете что, оно реально удобно. Особенно когда ты просто хочешь поменять цвета и не хочешь гуглить, какая переменная за это отвечает.

«А как же POSIX?!»

Так вот, теперь про слона в комнате. «Fish не POSIX-совместимый!!!» — кричат люди в интернете, и у них от возмущения трясутся бороды. И это правда. Bash-скрипты в Fish не работают. Но давайте на секунду задумаемся: а когда вы в последний раз запускали .sh-скрипт прямо в интерактивной оболочке? Каждый нормальный скрипт начинается с #!/bin/bash и выполняется Bash’ем независимо от того, какая оболочка у вас стоит по умолчанию. Fish — это не замена Bash для скриптов. Это замена Bash для вашей ежедневной работы в терминале. Для навигации, для Git, для запуска команд, для всего того, что вы делаете руками. И для этого он объективно лучше.

Про скорость запуска

Ещё момент про скорость. Чистый Zsh стартует быстро. Zsh с Oh My Zsh и десятком плагинов — уже нет. У меня были конфигурации, где новое окно терминала открывалось с задержкой в полсекунды. Полсекунды! Каждый раз! Я открываю терминал десять-двадцать раз в день, и каждый раз жду. Это как микроинсульт для продуктивности. Fish стартует мгновенно, потому что всё, ради чего люди обвешивают Zsh плагинами, здесь встроено и оптимизировано.

Итого

Короче, вот что я хочу сказать. Bash — это наследие. Он был создан в 1989 году, и это чувствуется. Он живёт на серверах, он есть везде, его никуда не деть — как Internet Explorer в своё время. Zsh — это попытка сделать Bash лучше, обвешав его плагинами и фреймворками, и в целом попытка неплохая, но это всё равно тюнинг «Жигулей». Можно поставить спойлер, можно покрасить, можно даже движок поменять, но это всё ещё «Жигули».

Fish — это другая машина. Спроектированная с нуля для того, чтобы человеку было удобно сидеть в терминале. Без исторического багажа, без обратной совместимости с синтаксисом из восьмидесятых. Поставьте, попробуйте неделю. Если захотите вернуться на Bash — ну, я вас не осуждаю. Вру. Немного осуждаю.

Комментарии