Знакомство с рыбой, дружественной интерактивной оболочкой

До сих пор, используя системы Unix, я придерживался Bash в качестве среды оболочки. Это происходит по разным причинам, но в основном из-за его повсеместного распространения. Существуют хорошо известные альтернативные проекты оболочки, такие как zsh, которые основываются на Bash с принципом «добавить больше», но в прошлом это не побудило меня стать постоянным пользователем.
Fish - это значительный отход от Bash, выпущенного в 2005 году под блестящим слоганом: Наконец-то, оболочка командной строки для 90-х. Приложив немного времени и любопытства, мне показалось, что стоит быстро попробовать.
Сохранение минимального
Необходимость в плагине или исправленном ботаническом шрифте для настройки среды оболочки меня никогда особо не привлекала. В Bash я создал лишь скромный набор псевдонимов, экспорта и функций с целью минимализма и переносимости (установка в новых системах включает простой запуск stow bash из моего репозитория dotfiles). С рыбой мне пришлось меньше настраивать, и то, что у меня есть, стало заметно чище.
Особенности и впечатления
В целом, рыба сразу после покупки дает рядовым пользователям отличные возможности.
Интерактивные дополнения
По мере ввода fish предлагает встроенное завершение для ваших выражений, включая оптимистичное завершение по умолчанию, где это возможно, с использованием записей из history. Это вызывает привыкание.

- Используйте Tab, чтобы выбрать вариант завершения первого уровня.
- Используйте Ctrl + F, чтобы полностью развернуть текущее завершение.
- Используйте Вверх для просмотра истории в зависимости от того, что вы уже ввели.
Отличная команда для использования с завершением в fish - abbr. Это дополнительная альтернатива alias, которая вместо этого расширяет пользовательский ярлык при использовании.
abbr -a -g rsync 'rsync --progress'
Функции
Любой сценарий .fish, добавленный в ~ / .config / fish / functions, будет автоматически загружен и доступен в вашей оболочке.
По сравнению с bash, я считаю, что синтаксис сценария для определения функций в fish немного более элегантен. Мне также нравится, что вы можете включить описание, которое будет отображаться при просмотре функции в пользовательском интерфейсе завершения.
function fe --description 'Open fzf and edit file on selection'
fzf | read -l result
if [ $result ]
$EDITOR $result
end
end
Fish обычно использует функции над переменными. Например, вы можете создать свою собственную реализацию fish_prompt (а есть fish_right_prompt!) Или просто переопределить prompt_pwd, из которого она состоит. Для меня это имеет смысл и кажется более продуманным.
Кроме того, у вас будет больше возможностей порадоваться работе без исходных управляющих последовательностей терминала! set_color поддерживает как именованные цвета, так и шестнадцатеричные значения, а bind имеет простые выражения для клавиш-модификаторов, таких как Ctrl (\c).
Fish также предлагает события, абстракцию более высокого уровня для определения функций, которые являются обработчиками событий, запускаемых через emit event_name.
Документы и конфигурация
Fish считывает конфигурацию уровня пользователя из ~ / .config / fish / config.fish. Здесь вы можете запустить любую команду в init, чтобы переопределить переменные, установить привязки клавиш, определить псевдонимы и source другие файлы, как в Bash. Fish также по умолчанию читает ~ / .profile и ~ / .inputrc. Прекрасный.

Если вам нужно или вам просто интересно узнать, что доступно по умолчанию, fish также предлагает веб-приложение, которое можно настроить с помощью fish_config.

Все остальное, что вы можете настроить для рыбы по умолчанию, задокументировано на fishshell.com/docs и fishshell.com/docs/current/commands.
Совместимость
С чисто практической точки зрения для меня важно, чтобы большинство повседневных выражений и команд в Fish и Bash совпадали. В целом, я думаю, что Fish поступила правильно в этом отношении.
Операторы [|, <, >, >>] и большинство команд остаются идентичными Bash, который является достаточно большой частью уравнения в повседневном использовании. Однако сценарий, как мы видели, быстро обнаруживает различия в синтаксисе Fish, а сценарии Bash в большинстве случаев несовместимы.
Не все команды также эквивалентны. Примечательно, что echo по-разному ведет себя при интерполяции переменных и кавычках. При подстановке команд используются только скобки, а не $().
echo $USER@(hostname)
Сказав это, я могу сказать, что перенести мои настройки Bash на fish.
Вердикт
chsh -s /usr/bin/fish
После недели использования и адаптации я окончательно сменил оболочку. Опыт не меняет жизнь, но рыба обеспечивает отличные удобства прямо из коробки и кажется действительно более современной в использовании и конфигурации.
Различия в оболочках почти не возникали, особенно когда вы в основном проводите день, используя команды Unix. В то же время я буду продолжать поддерживать версии своих скриптов для Bash, но настраивать новые вещи на моих хостах разработки.
Если вас интересуют какие-либо настройки, показанные здесь для рыбы, вы можете просмотреть мой файл точки репозитория здесь.
Дополнительно
Для любителей плагинов
О, моя рыба! project предлагает платформу плагинов для расширения Fish с большим выбором тем и плагинов. 🎸

режим vi
Хорошо, это было в Баше, но работает также и с рыбой. 😉
set -g fish_key_bindings fish_vi_key_bindings