Spec-Zone.ru › Fish 3.4

функция - создание функции

Краткое описание

function NAME [OPTIONS]; BODY; end

Описание

function создаёт новую функцию NAME с телом BODY.

Функция представляет собой список команд, которые будут выполнены при вводе имени функции в качестве команды.

Доступны следующие параметры:

-a NAMES или --argument-names NAMES

Присваивает значения последовательных аргументов командной строки именам, указанным в NAMES.

-d DESCRIPTION или --description DESCRIPTION

Описание того, что делает функция, подходящее для описания завершения.

-w WRAPPED_COMMAND или --wraps WRAPPED_COMMAND

Наследует автодополнение от указанной команды WRAPPED_COMMAND. Подробнее см. документацию по команде complete.

-e EVENT_NAME или --on-event EVENT_NAME

Выполняет эту функцию при появлении указанного события. Fish генерирует внутренние события, например, при отображении приглашения. Пользовательские события можно генерировать с помощью команды emit.

-v VARIABLE_NAME или --on-variable VARIABLE_NAME

Выполняет эту функцию при изменении значения переменной VARIABLE_NAME. Обратите внимание, что fish не гарантирует определённого времени выполнения или даже выполнения функции для каждого set. Вместо этого функция будет выполнена, как только переменная будет установлена хотя бы один раз, возможно пропустив некоторые значения или выполнившись, когда переменная была установлена в то же значение (за исключением универсальных переменных, установленных в других оболочках — для них будут учтены только изменения значения).

-j PID или --on-job-exit PID

Выполняет эту функцию при завершении задачи, содержащей дочерний процесс с заданным идентификатором процесса PID. Вместо PID можно указать строку ‘caller’. Это разрешено только при использовании подстановки команды, и это приведёт к запуску обработчика при завершении задачи, создавшей эту подстановку команды.

-p PID или --on-process-exit PID

Выполняет эту функцию при завершении дочернего процесса Fish с идентификатором процесса PID. Для обратной совместимости вместо PID можно использовать «%self», что является псевдонимом для $fish_pid, и функция будет выполнена при выходе текущей инстанции Fish.

-s SIGSPEC или --on-signal SIGSPEC

Выполняет эту функцию при получении сигнала SIGSPEC. SIGSPEC может быть номером сигнала или именем сигнала, например, SIGHUP (или просто HUP). Обратите внимание, что сигнал должен быть получен fish; например, Ctrl-C отправляет SIGINT в фоновый процесс, который не будет fish, если вы выполняете другую команду в данный момент.

-S или --no-scope-shadowing

Разрешает функции получать доступ к переменным вызывающих функций. Обычно любые переменные внутри функции, имеющие то же имя, что и переменные вызывающей функции, «затеняются», и их содержимое независимо от вызывающей функции.

Важно отметить, что это не захватывает ссылаемые переменные или область видимости на момент объявления функции! В данный момент Fish не имеет понятия о замыканиях, а время жизни переменных никогда не продлевается. Другими словами, используя --no-scope-shadowing, область видимости функции при каждом её запуске делится с областью видимости, из которой она была вызвана, а не с областью видимости, в которой она была определена.

-V или --inherit-variable NAME

Сохраняет значение переменной NAME и определяет локальную переменную с тем же именем и значением при определении функции. Это похоже на замыкание в других языках, таких как Python, но немного отличается. Обратите внимание на слово «снимок» в первом предложении. Если вы измените значение переменной после определения функции, даже если вы сделаете это в той же области видимости (обычно в другой функции), новое значение не будет использоваться функцией, которую вы только что создали с помощью этого параметра. См. пример function notify ниже, чтобы понять, как это можно использовать.

Если пользователь вводит дополнительные аргументы после имени функции, они вставляются в список переменных окружения переменных $argv. Если указан параметр --argument-names, аргументы также присваиваются именам, указанным в этом параметре.

С помощью одного из переключателей обработчиков событий можно сделать так, чтобы функция запускалась автоматически в определённых событиях. Пользователь может генерировать новые события с помощью встроенной команды emit. Fish генерирует следующие именованные события:

  • fish_prompt, которое генерируется всякий раз, когда собирается отобразиться новое приглашение Fish.
  • fish_preexec, которое генерируется непосредственно перед выполнением интерактивной команды. Командная строка передаётся в качестве первого параметра. Не генерируется, если команда пуста.
  • fish_posterror, которое генерируется сразу после выполнения команды со синтаксическими ошибками. Командная строка передаётся в качестве первого параметра.
  • fish_postexec, которое генерируется сразу после выполнения интерактивной команды. Командная строка передаётся в качестве первого параметра. Не генерируется, если команда пуста.
  • fish_exit генерируется непосредственно перед выходом Fish.
  • fish_cancel, которое генерируется при очистке командной строки (используется для интеграции с терминальной оболочкой).

Пример

function ll
    ls -l $argv
end

выполнит команду ls, используя параметр -l, передавая любые дополнительные файлы и переключатели команде ls.

function mkdir -d "Create a directory and set CWD"
    command mkdir $argv
    if test $status = 0
        switch $argv[(count $argv)]
            case '-*'

            case '*'
                cd $argv[(count $argv)]
                return
        end
    end
end

Это выполнит команду mkdir, и если она успешно выполнится, изменит текущую рабочую директорию на только что созданную.

function notify
    set -l job (jobs -l -g)
    or begin; echo "There are no jobs" >&2; return 1; end

    function _notify_job_$job --on-job-exit $job --inherit-variable job
        echo -n \a # beep
        functions -e _notify_job_$job
    end
end

Это заставит зазвучать звуковой сигнал при завершении последней задачи.

Примечания

События принимаются только от текущего процесса Fish, так как нет способа отправлять события из одного процесса Fish в другой.

См. также

Для более подробного объяснения того, как функции используются в Fish, см. Функции.

© 2022 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.4/cmds/function.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API