LINUX.ORG.RU

Переезжаем на Fish

 , ,

Переезжаем на Fish

1

3

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:

★★★

Проверено: dataman ()
Последнее исправление: rtxtxtrx (всего исправлений: 25)
Ответ на: комментарий от rtxtxtrx

Лучше не стало. Почему бы просто не сделать скриншот с работающим fish?
Может даже в gif, что продемонстрирует фичи автодополнения fish.

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

Ой, а можно такую же статью по zsh?

Aceler ★★★★★
()

Резюме: фиш — это не баш. Хорош всем, кроме того что не баш. Так же через плагин можно запустить баш.

Кек.

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

баш - это лучшее, что придумало человечество наряду с flatpak, docker, sudo и двухфакторной авторизацией по otp

rtxtxtrx ★★★
() автор топика

nix-env -i fish

Это антипаттерн для nix

Правильно так (на попробовать)

nix-shell -p fish --run fish

А потом либо в конфиг системы, либо в home-manager (если используют).

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

А чем он луче zsh?

Автодополнения генерируются прямо из man-файлов:

$ fish_update_completions

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

баш - это лучшее, что придумало человечество

Сама идея шелла, пайпы, скрипты, вызов внешних команд - да. Сам баш с его синтаксисом - отстой.

skyman ★★★★
()

Заменим убогий ls на модный ROR-аналог

А что можно требовать от ls? Там же нечегу улучшать…

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

Есть чего. В стандартном ls нет колонок с -l и раскраска скуднее.

neumond
()

Оно конечно хорошо, все эти подсветки, подсказки автодополнения, прочие плюшки. Сам давно думал установить что-нибудь эдакое, этот же Фиш например. Но не стал, т.к. не на своём компьютере обычно будет sh или bash и нет того, к чему привыкнешь, и тогда придётся больно.

mobster
()

у меня один только вопрос, почему эта статья в разделе «Администрирование», а не в разделе «Desktop» ?

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

у меня один только вопрос, почему эта статья в разделе «Администрирование», а не в разделе «Desktop» ?

Потому что к Desktop относятся GUI-приложения, а Shell и всё, что связано с терминалом, традиционно относят к разделу «Администрирование».

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

иконки показывать

Это чтобы можно было какую-нибудь уязвимость в imagemagick через ls вызвать? Нужно!

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

Я перефразирую, у меня есть ощущение (конечно может обманчивое), что fish живет исключительно на десктопах пользователей, а на «серверах», «внутри контейнеров», в «виртуалках» его нет и в помине.

а Shell и всё, что связано с терминалом, традиционно относят к разделу «Администрирование».

есть большое количество TUI приложений которые отлично живут в «терминале», но никак не относятся к «Администрированию»

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

а на «серверах», «внутри контейнеров», в «виртуалках» его нет и в помине.

На серверах может быть Shell по выбору администратора. Потом администриование включает в себя написание сценариев, у администраторов разные вкусы по поводу выбора языка для скриптов. А языки в Shell используются разные, часто обратно не совместимые c Bash (Zsh, Fish).

Бывают вообще отличные от Bash и Sh, такие как Nushell. И каждый админ выбирает тот язык который ему больше нравится.

есть большое количство TUI приложений которые отлично живут в «терминале», но никак не относятся к «Администрированию»

Тема не о TUI приложении, а о конкретно о Shell. Всегда вопросы работы с Shell, коммандной строкой, и однострочными сктиптами относились к Администрированию.

Удивительно, что вы этого не знаете, еще и дизлайки ставите когда вам объясняют.

P.S. Терминалы начали использоваться еще с 19 века, и во всю исползовались в связи до появления комьютеров. Какой Desktop, если сама идея рабочего стола повяилась в 70ые годы 20го века?

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

На серверах может быть shell по выбору администратора.

Речь ровно идет о том 0.001% кто держит у себя на серверах fish

Потом администриование включает в себя написание сценариев, у администраторов разные вкусы по поводу выбора языка для скриптов.

Вы админ локалхоста?

Тема не о TUI приложении, а о конкретно о Shell.

Как вы ловко выписали Shell из TUI приложений

Всегда вопросы работы с Shell, коммандной строкой, и однострочными сктиптами относились к Администрированию.

Вы недавно с линуксом общаетесь?

Удивительно, что вы этого не знаете, еще и дизлайки ставите когда вам объясняют.

Держите еще один, но не принимайте близко к сердцу, я вижу что вы очень чувствительный.

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

Держите еще один, но не принимайте близко к сердцу, я вижу что вы очень чувствительный.

Школота в чате.

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

На серверах может быть Shell по выбору администратора.

Вы админ локалхоста?

Вы недавно с линуксом общаетесь?

В мире BSD используют Sh, Ksh, Tcsh, Csh.

This shell is the standard shell for scripting and interactive use in NetBSD.

OpenBSD’s default shell is ksh, which is based on the public domain Korn shell. Shells such as bash and many others can be added from packages.

FreeBSD comes with several shells, including the Bourne shell (sh(1)) and the extended C shell (tcsh(1)). Other shells are available from the FreeBSD Ports Collection, such as zsh and bash.

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

Тема не о TUI приложении, а о конкретно о Shell.

Как вы ловко выписали Shell из TUI приложений

Я еще раз спрошу, вы выписали shell из TUI ?

Это вы в своем воображении за меня выписали shell из TUI.

Не позорьтесь, зачем вы пытаетесь оспорить, оскорбить?

Видите, что вы не правы, у вас не хватает квалификации. Учитесь спокойно.

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

Не позорьтесь, зачем вы пытаетесь оспорить, оскорбить?

Не судите строго школьника

Видите, что вы не правы, у вас не хватает квалификации. Учитесь спокойно.

Это интернет, вы недавно в интернете? попробуйте не принимать все на личный счет, попробуйте мыслить шире.

Это вы в своем воображении за меня выписали shell из TUI.

тут вы меня подловили, воображение у меня действительно развито, получается что $SHELL это все-таки TUI?

gagarin0
()

Спасибо, но я делал графонистый prompt и писал кучу алиасов в .bashrc не для того чтобы всё это смыть в унитаз.

Skullnet ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.