LINUX.ORG.RU

Fish 3.4.0

 ,


1

2

Fish (Friendly interactive shell) — оболочка, предоставляющая удобный интерфейс командной строки и предназначенная для интерактивного использования.

Наиболее значимые изменения, вошедшие в релиз:

Дополнен синтаксис подстановки команд, теперь $(cmd) имеет тот же смысл, что и (cmd), но может использоваться внутри двойных кавычек, чтобы предотвратить разбиение вывода.

# теперь команда
foo (bar | collect strings)
# эквивалентна
foo "$(bar)"

# а

foo (bar)
# можно записать как
foo $(bar)

Как и команда prompt, команда fish_config получила встроенную подкоманду theme, что позволяет настраивать тему не выходя из терминала (ранее открывался браузер).

Команды set и read получили аргумент --function для определения переменных в области видимости всей функции.

function demonstration
    if true
        set --function foo bar
        set --local baz banana
    end
    echo $foo # выведет "bar" потому что $foo все еще существует
    echo $baz # ничего не выведет, так как $baz вышел из области видимости
end

Команда string pad теперь корректно обрабатывает известные fish управляющие последовательности, а команда string length получила аргумент --visible, при использовании которого она вычислит «видимую» длину переданной ей строки — количество ячеек терминала, которые она займет при выводе.

Производительность глоббинга значительно возросла, особенно на системах с glibc. На некоторых образцах время на выполнение глоббинга уменьшилось почти вдвое.

Автоподсказки теперь можно отключить, установив $fish_autosuggestion_enabled в 0, а подсветку (почти) полностью выключить, выбрав тему «None» — не отключаются только необходимые для работы цвета, например, те, что используются для различения подсказки и актуального содержимого командной строки.

Исправлено CVE-2022-20001 — потенциальная дыра в безопасности, позволяющая исполнять произвольные команды, определяемые содержимым репозитория. Исправление заключается в переопределении команды git функцией fish_git_prompt.

Добавлен флаг ampersand-nobg-in-token, при установке которого амперсанд работает как оператор только если за ним следует разделитель.

echo foo&bar # напечатает "foo&bar", вместо запуска "echo foo" в фоновом режиме и запуска "bar"
echo foo & bar # запустит "echo foo" в фоне и затем запустит "bar"
# с установленными флагами ampersand-nobg-in-token и qmark-noglob аргумент в этой команде не содержит специальных символов
open https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be

Флаги могут быть установлены во время запуска с помощью fish --features ampersand-nobg-in-token,qmark-noglob или с помощью универсальной переменной fish_features:

set -Ua fish_features ampersand-nobg-in-token

Символ _ теперь является зарезервированным ключевым словом.

Mac OS X 10.9 более не поддерживается. Теперь минимальная версия Mac – Mac 10.10 «Yosemite».

Также в этой версии внесено значительное количество иных улучшений и исправлений, о которых можно прочитать по ссылке.

>>> Подробности

★★★★

Проверено: hobbit ()

Кто какие скрипты для fish себе пишет? Мне вот как-то не особо надо было.

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

возможно пофиксили наконец, надо потыкать.

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

ломает scp/sshfs

Подробнее? scp я не пользуюсь, поэтому подтвердить или опровергнуть не могу, но относительно sshfs УМВР.

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

а чем оно лучше zsh, кроме искоробочности?

Как-то я пытался воспроизвести используемые мной фичи fish в zsh. Долго плясал с бубном, но итоговый результат так и остался на уровне кросовок Abibas.

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

The results are very impressive:

лол, это всё сказки для лохов.
там чувак на полном серьёзе сравнивает скорость «fish -c 'exit 0'» и «zsh -c 'exit 0'».

как только дело доходит до худо-бедно реального скриптинга, fish показывает себя гораздо хуже того же zsh:

~ ➤  ls IMG*                                                                                                                                                                                                                                                              
IMG_20210924_1551085.jpg  IMG_20210925_1513060.jpg  IMG_20210928_2025289.jpg  IMG_20220122_1943576.jpg  IMG_8693.MOV

~ ➤  time bash -c "for i in \$(seq 1 1000); do files=\"IMG*\"; echo \$files; done" | wc -l                                                                                                                                                                                
1000
bash -c "for i in \$(seq 1 1000); do files=\"IMG*\"; echo \$files; done"  0.02s user 0.04s system 99% cpu 0.061 total

~ ➤  time zsh -c "for i in {1..1000}; do files=(IMG*); echo \$files; done" | wc -l                                                                                                                                                                                        
1000
zsh -c "for i in {1..1000}; do files=(IMG*); echo \$files; done"  0.02s user 0.05s system 98% cpu 0.067 total

~ ➤  time fish -c "for x in (seq 1000); echo \$i; set files IMG_*; echo -n \$files; end" | wc -l                                                                                                                                                                          
1000
fish -c "for x in (seq 1000); echo \$i; set files IMG*; echo -n \$files; end  0.10s user 0.04s system 100% cpu 0.144 total


это прям максимально стандартный набор задачек для шелла — циклы, переменные, globbing.

fish слил в два с лишним раза zsh'у и в два с половиной раза bash'у.

единственное, что тормозит в zsh — это oh-my-zsh, но это какбэ не обязательный его компонент.

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

zsh сложен в настройке, это правда.
есть oh-my-zsh, но он раздутый и тормозит.

но (!) настраивается он один раз на всю жизнь, в отличие от того же fish, где от релиза к релизу раньше любили ломать совместимость (как сейчас — не знаю)


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

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

например, автодополнение из предыдущих команд.

типа, вводишь «ssh 10.», нажимаешь стрелочку вправо — шелл автодополнит последним IP-адресом из истории шелла.

есть какие-то ещё фичи, которые для меня уже сами собой разумеющиеся — я их не замечаю, но в случае запуска bash я начинаю недоумевать.


а, ну и то же «интерактивное» автодополнение имён файлов: https://imgur.com/YucCl4n.png

т.е. можно курсором выбрать нужный тебе файл, в bash так нельзя.

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

например, автодополнение из предыдущих команд.

И всё? Только автодополнение? а PS1? Да чтобы гит показывал, как шасс модна?

Я курсор не жму. Нет у меня стрелочек.

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

у меня максимально простой $PS1:

~ ➤ 


всякие моднявые штуки в строке приглашения для меня как-то чужды, в т.ч. инфо о git репозитории.

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

Странно, очень странно. Ну да. Я когда давно пробовал, то за неделю к автодополнению сильно привык. Но вернувшись на bash стал точнее. bash-completion работает.

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

И всё? Только автодополнение?

этого достаточно.
zsh практически полностью обратно совместим с bash (и полностью обратно совместим с sh), ты как минимум ничего не теряешь.

fish — это не POSIX-shell, со всеми вытекающими.

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

bash-completion это про другое, он не дополняет командами из истории

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

Fish 3.4.0 (комментарий)

плюсы: всё тоже самое, что умеет хорошо настроенный zsh, только из коробки.
минусы: не POSIX, меньшая пользовательская база

минусы не для всех: если есть большой парк серверов, где ты ещё и не единолично админишь — могут быть некоторые НЕУДОБСТВА.

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

Дело как раз в том, что я был готов потратить время на настройку ради POSIX-совместимости и большей «мейнстримности». Но всё равно не получилось воспроизвести тех фич, которые были в fish из коробки (совсем либо в том виде, в котором на них не было бы больно смотреть).

как сейчас

На моей памяти ничего не ломалось.

sudopacman ★★★★★ ()

Кто нибудь пробовал ставить дефолтным шеллом в Debian? Сижу сейчас ковыряюсь с ZSH, поскольку он совместим с Bash, но есть ли в этом смысл?

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

Но всё равно не получилось воспроизвести тех фич,

это которые?

На моей памяти ничего не ломалось.

когда я его тыкал (году в 2017-2018), было очень много лулзов с заменой «^ /dev/stderr» на «2> /dev/stderr», а также && на and, || на or (или наоборот).

это несерьёзно.

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

это которые?

Точно не помню, какие конкретно были проблемы. Но точно помню, что был неприятно удивлён, что у плагинов, позиционирующихся как ответ fish, всё настолько плохо. Ещё запомнилось отсутствие нормальной цветовой схемы (в fish я просто ставлю Tomorrow Night).

а также && на and, || на or

Поддержку && и || добавили уже давно.

sudopacman ★★★★★ ()

Отличная оболочка. Использую уже много лет. Скорость выполнения скриптов меня особенно не интересует. Сам скрипты на fish почти не пишу, только несколько несложных алиасов.

В fish есть просто какое-то удобство, которое сложно объяснить. Она не воспринимается как набор хаков, которыми являются bash, zsh (интересно, bash до сих пор историю регулярно теряет?), а прямо вот удобным заточенным под человека инструментов. Как будто её сделали люди для людей, а не рептилоиды-инопланетяне, как bash и zsh.

И если раньше о ней мало кто слышал, то теперь постоянно вижу у коллег fish, в различных видео на YouTube fish.

А скорость, при необходимости, можно и оптимизировать. Вот рептилоидный UX древних оболочек уже никак не оптимизировать.

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

Почему отменили? В примечаниях к релизу написано об отказе от использования устаревшего по мнению разработчиков протокола rcp/scp в пользу sftp. Возможны проблемы с совместимостью на пожилых системах, однако непосредственно scp это не отменят.

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

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

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

Ну bash-скрипты нужно запускать в bash

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

Я заметил. Эти шеллы более общительные. Заставляют тыкать таб в переборе, вместо продолжения набора, выхлоп богаче, рекомендации всякие. Может, я не умею готовить? У меня конфиг такой:

autoload -U compinit
compinit

HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000

alias ll='ls --color=auto -alF'
alias la='ls --color=auto -A'
alias l='ls --color=auto -CF'
alias ..='cd ..'
alias ls='ls --color=auto'

PS1="%F{33}[%~]
%F{green}➥%f "

path+=/home/bratish/bin

eval `dircolors -b ~/.dircolors`

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

Так я zsh уже давно не пользуюсь. Fish в плане автодополнения гораздо приятней, чем zsh и bash. А история зависит от текущего каталога.

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

В смысле, что не умеет интерпретировать скрипты sh? Для этого есть bash

Puzan ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.