LINUX.ORG.RU

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

 , ,

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

4

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

При установке через fisher install плагины добавляются в тот список в файле, remove — удаляются. Если что-то удалить из него, то при вызове update будут удалены соответствующие плагины.

Ряд плагинов можно поставить через OMF:

omf update  # Обновим Oh my fish
omf install pyenv

omf так же можно использовать как пакетный менеджер

Прочее

Для работы с буфером обмена есть ф-ии 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 из admin

Перемещено dataman из desktop

★★★

Проверено: dataman ()
Последнее исправление: rtxtxtrx (всего исправлений: 26)
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от gagarin0

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

Есть разница между терминами CLI и TUI:

  • TUI эмулирует оконный интерфейс, добавляет концепцию окон с постоянными секторами.
  • CLI это то, что релизует Shell формат вопрос/ответ.

По этому различаютя CLI файловые менеджеры, и TUE файловые менеджеры.

https://github.com/leo-arch/clifm/wiki/Introduction#what-is-clifm

Хотя в разговорной речи TUI и CLI синонимы.

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

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

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

Плагины в Fish

Доктор Ватсон, бывало, устанавливал Шерлоку Холмсу в zsh плагины, пока тот не видел. Потом Шерлок Холмс перешел на fish — но Ватсон без плагинов уже не мог.

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

Я вижу вы и сами в теме плаваете, вам не удалось переубедить меня что cli не входит в Terminal User Interface категорию программ, а место этой статьи в категории Desktop

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

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

железной девой, фронтальной лоботомией и вирусом ковид-19.

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

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

Разрушение мандалы - особый ритуал в тибетском буддизме, смысл которого подчеркнуть один из важнейших постулатов буддизма, идею о непостоянстве всего сущего и непривязанности к плодам своей деятельности. Монахи создают мандалу из цветного песка, ритуал занимает несколько дней и в конце мандала разрушается. «Неважно сколько труда мы вложили в создание, - говорят монахи, - неважно, что в итоге получилась картина немыслимой красоты, мы не должны позволять себе привязываться к внешней форме. Всё в этом мире подвержено разрушению, и мандала не исключение. Ритуал разрушения - это редкая возможность задуматься о бренности бытия. Прочувствовав это на глубоком уровне, мы не станем отвлекаться на красивые картинки, но будем стремиться к истинному знанию».

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

хотел бы я посмотреть на . dot-файлы этих тибетских монахов

Это вполне возможно 🙂

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

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

вам не удалось переубедить меня что cli не входит в Terminal User Interface категорию программ,

У меня не стоит цель переубедить лично вас, пользователь задает вопрос, в котором как мне кажется я разбераюсь, я даю ответ. Параллельно сверясь с документацией. Ваша личность тут ни как не фигурирует.

Классические работа с CLI всегда относилась к администрированнию. В то время как был класс программ с развитым пользовательским интерфейсом: кнопками, окнами, меню, которые раотают в терминале, но похожи на GUI. Получается интерфейс из текста, но не очень подходит под определение «администрирование».

Как выяснилось сегодня из новости про СliFM, такие программы имеют четкий однозначный термит - TUI.

Мне тоже казалось, что TUI и CLI синонимы. Как выходит нет, темрин TUI для программ вроде aptitude, a CLI для apt, dpkg.

а место этой статьи в категории Desktop

Дальше, программы c CLI интерфейсом могут с легостью автоматизироваться чрезе различные типы Shell языков. Так как Shell script формирует сроку комманды, и анализирует ответ. Shell REPL и СLI интерфейс тесно переплетены.

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

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

вместо очередных абзацев гуманитарых рассуждений, будьте любезны, ответьте однозначно:

$SHELL входит/попадает в категорию программ Terminal User Interface?

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

это прекрасно, очень хорошо описывает как я год назад решил разобраться с помойкой bashrc и перешел на рыбу)

правда без плагинов все равно не обошлось, но даже с ними конфиг получился в разы меньше чем было для баша

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

вместо очередных абзацев гуманитарых рассуждений, будьте любезны, ответьте однозначно:

$SHELL входит/попадает в категорию программ Terminal User Interface?

Нет, $SHELL (например, Bash, Zsh, Fish) не входит в категорию Terminal User Interface (TUI). $SHELL — это командная оболочка (Command Line Interface, CLI), которая взаимодействует с пользователем через текстовый ввод и вывод. TUI — это программы с графикоподобным интерфейсом в терминале (например, htop, nano, mc), которые используют элементы вроде меню, кнопок и окон, но работают в текстовом режиме.

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

шеллы не имеют отношения к категории десктоп (в отличии от эмуляторов терминала, хотя они тоже чисто админская вещь), потому как без всяких иксов/вафленых запускаются, без оконных менеджеров и desktop environment. мне как бы и плевать в какой категории статья, но я просто за справедливость

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