Spec-Zone.ru › Fish 3.7

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

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

function NAME [OPTIONS]; BODY; end

Описание

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

Функция — это список команд, которые будут выполнены, когда имя функции будет задано как команда.

Доступны следующие опции:

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

Присваивает значения последовательных аргументов командной строки именам, указанным в NAMES. Это те же аргументы, что и в argv, и они по-прежнему доступны там. Также см. Обработка аргументов.

-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, если вы выполняете другую команду в это время. Наблюдение за сигналом предотвратит выход fish в ответ на этот сигнал.

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

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

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

-V или --inherit-variable NAME

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

Обработчики событий (on-event, on-variable, on-job-exit, on-process-exit и on-signal) вызывают автоматическое выполнение функции в определённые моменты. Новые события с именами для --on-event могут быть вызваны с помощью встроенной команды emit. Fish уже генерирует несколько событий, см. Обработчики событий для получения более подробной информации.

Имена функций не должны совпадать с зарезервированными ключевыми словами. К ним относятся элементы синтаксиса fish или встроенные команды, которые необходимы для работы оболочки. Текущие зарезервированные слова — [, _, and, argparse, begin, break, builtin, case, command, continue, else, end, eval, exec, for, function, if, not, or, read, return, set, status, string, switch, test, time, и while.

Пример

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, см. Функции.

© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.7/cmds/function.html

Spec-Zone.ru

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