Как управлять командой functions в оболочке Fish в Linux

Команда functions в оболочке Fish используется для управления функциями Fish и взаимодействия с ними. Она позволяет просматривать, редактировать, удалять и даже сохранять функции. В этой статье мы узнаем, как управлять функциями в оболочке Fish на примере Linux.
Что это за команда functions?
В оболочке Fish команда functions — это блоки многократно используемого кода, которые вы можете определять и вызывать по имени. Команда functions — это встроенная утилита, которая помогает управлять этими функциями. Вы можете использовать её для:
- Перечислите все функции.
- Отобразите код определенной функции.
- Отредактировать функцию.
- Стереть (delete) функцию.
- Сохранить в файл функцию.
Когда и зачем использовать команду functions?
- Эффективность: быстрое управление и изменение функций без необходимости вручную редактировать файлы конфигурации.
- Отладка: легко проверяйте функции и устраняйте неполадки.
- Переносимость: сохранение функций в разных системах и совместное использование.
- Гибкость: переопределяйте или расширяйте встроенные команды с помощью пользовательского поведения.
Управление функциями в оболочке Fish
1. Определите (Создайте) новую функцию
Есть два способа определить новую функцию. Вы можете либо напрямую определить её в файле конфигурации fish (~/.config/fish/config.fish), либо определить её в отдельном файле в пользовательском каталоге (например, ~/.config/fish/functions/).
Ключевое различие между определением функции в ~/.config/fish/config.fish и её сохранением в ~/.config/fish/functions/ заключается в том, как Fish обрабатывает загрузку и выполнение функций.
1.1. Определение функции в config.fish
Когда вы добавляете функцию непосредственно внутрь ~/.config/fish/config.fish, она запускается каждый раз, когда запускается новая оболочка Fish.
Пример:
function cdls
    # Перейдите в указанный каталог
    builtin cd $argv[1]
    and begin
        # Вывод содержимого каталога с тайм-аутом в 1 секунду
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end
Плюсы:
- Убегает, когда запускается оболочка Fish.
- Подходит для небольших функций или быстрой настройки.
Минусы:
- Если у вас много функций в config.fish, это может привести к загромождению.
- Функции загружаются только при запуске новой оболочки, то есть для внесения изменений требуется перезапустить Fish (exec fishили заново открыть терминал).
- Более медленный запуск, если config.fishсодержит много функций.
1.2. Функция сохранения в пользовательском каталоге
Когда вы используете funcsave function_name или вручную создаёте файл в ~/.config/fish/functions/, Fish автоматически загружает функцию при необходимости.
Сначала создайте функцию в вашем текущем сеансе Fish:
function cdls
    # Перейдите в указанный каталог
    builtin cd $argv[1]
    and begin
        # Вывод содержимого каталога с тайм-аутом в 1 секунду
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end
На этом этапе функция будет работать в вашем сеансе, но исчезнет при перезапуске Fish.
Чтобы сохранить определенную функцию навсегда, мы можем использовать команду funcsave.
funcsave cdls
Это сохраняет cdls в ~/.config/fish/functions/cdls.fish, содержащий:
function cdls
    # Перейдите в указанный каталог
    builtin cd $argv[1]
    and begin
        # Вывод содержимого каталога с тайм-аутом в 1 секунду
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end
Плюсы:
- Fish загружает функцию только при использовании, сохраняя быстрый запуск.
- Функции хранятся отдельно, что упрощает управление ими.
- Вы можете удалить функцию навсегда, удалив ее .fishфайл без редактированияconfig.fish.
Минусы:
- Требуется выполнить дополнительный шаг для сохранения (funcsave function_nameили вручную создать.fishфайл).
- Новым пользователям может быть неочевидно, где хранится функция.
Лучшая практика?
- Если функция небольшая и важная (например, функция-псевдоним), то можно добавить её в config.fishбез проблем.
- Если функция используется время от времени или является сложной, лучше хранить её в ~/.config/fish/functions/для удобства и повышения производительности.
2. Перечислите все функции
Чтобы просмотреть список всех функций, определённых в вашей оболочке Fish, используйте:
functions
Здесь будут отображаться названия всех функций, включая встроенные и созданные вами пользовательские.
Пример вывода:
N_, abbr, alias, bg, cd, cdh, cdls, contains_seq, delete-or-exit, diff, dirh, dirs, disown, down-or-search, edit_command_buffer, export, fg, fish_add_path, fish_breakpoint_prompt, fish_clipboard_copy, fish_clipboard_paste, fish_command_not_found, fish_commandline_append, fish_commandline_prepend, fish_config, fish_default_key_bindings, fish_default_mode_prompt, fish_git_prompt, fish_greeting, fish_hg_prompt, fish_hybrid_key_bindings, fish_indent, fish_is_root_user, fish_job_summary, fish_key_reader, fish_mode_prompt, fish_opt, fish_print_git_action, fish_print_hg_root, fish_prompt, fish_sigtrap_handler, fish_status_to_signal, fish_svn_prompt, fish_title, fish_update_completions, fish_vcs_prompt, fish_vi_cursor, fish_vi_key_bindings, funced, funcsave, grep, help, history, isatty, kill, la, ll, ls, man, nextd, nextd-or-forward-word, open, popd, prevd, prevd-or-backward-word, prompt_hostname, prompt_login, prompt_pwd, psub, pushd, realpath, seq, setenv, suspend, trap, umask, up-or-search, vared, wait
3. Просмотрите код функции
Чтобы просмотреть код определенной функции, используйте:
functions <function_name>
Например, чтобы увидеть код для функции cdls:
functions cdls
При этом будет выведено полное определение функции cd .
function cdls
    # Перейдите в указанный каталог
    builtin cd $argv[1]
    and begin
        # Вывод содержимого каталога с тайм-аутом в 1 секунду
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end
4. Отредактируйте функцию
Вы можете отредактировать функцию непосредственно в текстовом редакторе по умолчанию, используя:
funced <function_name>
Например, для редактирования функции cd:
funced cdls
Это откроет функцию в вашем редакторе (например, nano или vim), и вы сможете её изменить. После сохранения и выхода изменения вступят в силу немедленно.
5. Сохраните функцию в файл.
Это ТО ЖЕ самое, что создавать новые функции с помощью команды funcsave.
Сначала определите функцию в текущем сеансе.
Если вы хотите сохранить определение функции в файле, используйте:
functions <function_name> > filename.fish
Например, чтобы сохранить cdls функцию в файл:
functions cdls > ~/.config/fish/functions/cdls.fish
Это полезно для резервного копирования или совместного использования функций.
6. Скопируйте функцию
Вы можете скопировать существующую функцию под новым именем, используя -c или --copy:
functions --copy <old_function_name> <new_function_name>
Например, чтобы скопировать cd функцию в новую функцию, вызываемую mycd:
functions --copy cd mycd
Теперь вы можете изменять mycd, не затрагивая исходную cd функцию.
7. Стереть (Delete) функцию
Чтобы удалить функцию из текущего сеанса, используйте флаг -e или --erase:
functions --erase <function_name>
Например, чтобы удалить пользовательскую функцию cdls:
functions --erase cdls
Это удаляет cdls, но не влияет на постоянные функции, сохранённые в config.fish или в каталоге ~/.config/fish/functions/.
Чтобы навсегда удалить функцию, откройте файл конфигурации fish и закомментируйте или удалите всю функцию.
После удаления функции перезагрузите fish, чтобы применить изменения:
exec fish
Или перезагрузите свой терминал.
Если вы сохранили функцию с помощью funcsave или создали её вручную, Fish сохранит её в ~/.config/fish/functions/.
Чтобы удалить его навсегда, просто удалите файл функции:
rm ~/.config/fish/functions/function_name.fish
Пример:
rm ~/.config/fish/функции/cdls.fish
А затем перезагрузите fish или перезапустите терминал.
Краткое описание параметров команды functions
| Команда | Описание | 
|---|---|
| functions | Перечислите все функции. | 
| functions <function_name> | Отобразите код определенной функции. | 
| funced <function_name> | Отредактируйте функцию в текстовом редакторе по умолчанию. | 
| functions --erase <function_name> | Удалить функцию. | 
| functions --copy <old> <new> | Скопируйте функции новое имя. | 
| functions <name> > file.fish | Сохраните определение функции в файл. | 
Заключение
Команда functions — обязательный инструмент для пользователей оболочки Fish. Она даёт вам полный контроль над средой оболочки и упрощает работу с функциями. Для получения более подробной информации обратитесь к разделу о функциях в официальной документации Fish Shell.
Редактор: AndreyEx
 
  
  
  
  
 