Fish — это современный командный интерпретатор, недавно переписанный на Rust, который не требует особой настройки, поддерживая из коробки автодополнение и подсветку синтаксиса. Является лучшим Unix SHELL по версии Slant.
Установка
Установка Fish:
# Arch Linux, Manjaro и тп
sudo pacman -S fish
# Fedora
sudo dnf install fish
# NixOS
nix-env -i fish
# Ubuntu и остальные Debian-based
sudo add-apt-repository ppa:fish-shell/release-4
sudo apt update
sudo apt install fish
Чтобы сделать fish оболочкой по умолчанию для текущего пользователя:
sudo chsh -s $(which fish) $(whoami)
Прочитайте справку после запуска fish:
help
Fisher — это менеджер плагинов для Fish:
# Из стандартного репозитория Arch
pacman -S fisher
# Вручную
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
Конфигурация Fish
Основная конфигурация хранится в ~/.config/fish/config.fish
:
if not status is-interactive
exit
end
# Определим переменные XDG
set -q XDG_DATA_HOME || set -U XDG_DATA_HOME $HOME/.local/share
set -q XDG_STATE_HOME || set -U XDG_STATE_HOME $HOME/.local/state
set -q XDG_CONFIG_HOME || set -U XDG_CONFIG_HOME $HOME/.config
set -q XDG_CACHE_HOME || set -U XDG_CACHE_HOME $HOME/.cache
# Эти пути будут добавлены в $PATH единожды
fish_add_path -m ~/bin ~/.local/bin
# Различные настройки
# Двойное нажатие ESC не работает, если выставить меньше
set -g fish_escape_delay_ms 300
# В Yakuake вывод fetch не очень смотрится
if command -q fastfetch && ! string match -q -- "*yakuake*" (pstree -s -p $fish_pid)
fastfetch
end
function fish_user_key_bindings
# Тут пользовательские сочетания
end
Настроить fish можно через веб-интерфейс:
fish_config
Отличия Fish от Bash и ZSH
Другой синтаксис
- Нет
$$
и прочих$*
. - Не нужно экранировать переменные.
- Нет HEREDOC.
- Он напоминает Ruby с его
end
для обозначения окончания блока вместоfi
,done
,esac
и тп. - Вместо
$(command)
нужно писать просто(command)
. - Кроме алиасов есть аббревиатуры, которые при вводе заменяются на полную команду.
Существует множество отличий с которыми лучше ознакомиться, прочитав документацию:
Переменные окружения
Fish использует собственный механизм управления переменными окружения, который отличается от bash и zsh. Основные типы переменных:
set VAR value
— устанавливает переменнуюVAR
только в текущей сессии.set -x VAR value
— делает переменную доступной для дочерних процессов (аналогexport
в bash).set -gx VAR value
— глобальная переменная, доступная во всех сессиях fish.set -Ux VAR value
— универсальная переменная, которая сохраняется в~/.config/fish/fish_variables
, те эту команду достаточно ввести в терминале один раз.set -e VAR
— удаляет переменную.
Пример установки переменных:
set -x PATH /usr/local/bin $PATH # Добавляем путь в переменную окружения
set -Ux EDITOR vim # Устанавливаем универсальную переменную
Для модификации $PATH
есть функция fish_path_add
:
fish_add_path $HOME/bin $HOME/.local/bin
Это аналогично установке универсальных переменных:
set -U fish_user_paths $HOME/bin $HOME/.local/bin
Темы и оформление
Темы можно ставить как через fisher так и Oh my fish.
Oh my fish содержит ряд адаптированных тем из мегапопулярного Oh my zsh, а так же дополнительно позволяет ставить плагины:
curl -L https://get.oh-my.fish | fish
Поиск тем или пакетов:
omf search [ -t | -p ] name
Список тем:
omf theme
Установка темы:
omf install pure
Смена ее на дефолтную:
omf theme default
Через fisher так же можно ставить темы:
fisher install pure-fish/pure
Плагины в Fish
Работа с плагинами через fisher:
fisher install plugin_name
fisher remove plugin_name
fisher list
Редактирование списка установленных плагинов:
$EDITOR $__fish_config_dir/fish_plugins
Пример плагинов для установки:
Gazorby/fish-abbreviation-tips
PatrickF1/fzf.fish
jethrokuan/z
jorgebucaran/autopair.fish
jorgebucaran/replay.fish
nickeb96/puffer-fish
Популярные плагины, которые можно поставить:
-
Gazorby/fish-abbreviation-tips
: показывает подсказки для аббревиатур, помогая запомнить их. -
PatrickF1/fzf.fish
: интеграция fzf для удобного поиска файлов, истории команд и Git-веток. -
acomagu/fish-async-prompt
: асинхронно обновляет промпт. Бажный. -
franciscolourenco/done
: показывает десктопные уведомления о завершении длительных команд. -
jethrokuan/z
: быстрый переход по каталогам с использованиемz
. -
jorgebucaran/autopair.fish
: автоматическое закрытие скобок. -
jorgebucaran/replay.fish
: позволяет запускать команды Bash (replay ...
). -
joseluisq/gitnow@2.12.0
: содержит функции для работы с git. -
nickeb96/puffer-fish
: добавляет привычный многим!!
для быстрой подстановки предыдущей команды.
После редактирования списка запускаем обновление плагинов:
fisher update
Ряд плагинов можно поставить через OMF:
omf update # Обновим Oh my fish
omf install pyenv
Прочее
Для работы с буфером обмена есть ф-ии fish_clipboard_copy
и fish_clipboard_paste
.
Автодополнения генерируются прямо из man-файлов:
fish_update_completions
Алиасы можно сохранять прямо из терминала с помощью флага -s
:
# Заменим убогий ls на модный ROR-аналог
alias -s ls "eza --icons"
Добавляем sudo к текущей либо предыдущей команде:
function repeat_with_sudo
# Получаем текущую команду из командной строки
set -l cmd (commandline)
# Если команда пустая, берём последнюю команду из истории
if test -z "$cmd"
set cmd $history[1]
end
# Заменяем текущую команду на "sudo <команда>"
commandline -r "sudo $cmd"
end
funcsave repeat_with_sudo
# Это нужно добавить в конфиг
# Привязка к Alt+S
bind \es 'repeat_with_sudo'
# Готовый плагин для Oh my fish
omf install sudope
Переопределяем command not found:
function fish_command_not_found
# Вместо этой строки нужно какую-то логику реализовать
__fish_default_command_not_found_handler $argv[1]
end
funcsave fish_command_not_found
В арче, если установлен pkgfile, то все работает из коробки:
~
❯ python2
python2 may be found in the following packages:
archlinuxcn/python2 2.7.18-12 /usr/bin/python2
Менеджер сниппетов Pet можно интегрировать с fish через плагин otms61/fish-pet
:
fisher install otms61/fish-pet
Добавляем сочетание клавиш в ~/.config/fish/config.fish
:
function fish_user_key_bindings
bind \cs 'pet-select'
end
Резюме
Fish — примитивный шеллозаменитель для тех, кому лень заморачиваться с настройкой ZSH. Он существует достаточно давно, но его фанатская база не является какой-то огромной, пользователи часто пользуются дефолтом, редко меняя шелл. Плагинов так вообще кот наплакал в сравнении с остальными. Он хорош всем кроме нестандартного синтаксиса, что может быть проблемой, однако в 99% задач вы с этим скорее всего не столкнетесь. Так же вы можете использовать для выполнения нативного Bash команду replay
из плагина.
Полезные ресурсы
Дополнительные плагины и информация: https://github.com/jorgebucaran/awsm.fish
Полезные статьи fish: