Spec-Zone.ru › Fish 3.5

функция - создать функцию

Синтаксис

function NAME [OPTIONS]; BODY; end

Описание

function создаёт новую функцию ИМЯ с телом ТЕЛО.

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

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

-a ИМЕНА или --argument-names ИМЕНА

Присваивает значение последовательных аргументов командной строки именам, указанным в ИМЕНА.

-d ОПИСАНИЕ или --description ОПИСАНИЕ

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

-w ОБЕРНУТАЯ_КОМАНДА или --wraps ОБЕРНУТАЯ_КОМАНДА

Наследует автодополнение от заданной ОБЕРНУТОЙ_КОМАНДЫ. Для получения дополнительной информации см. документацию по complete.

-e ИМЯ_СОБЫТИЯ или --on-event ИМЯ_СОБЫТИЯ

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

-v ИМЯ_ПЕРЕМЕННОЙ или --on-variable ИМЯ_ПЕРЕМЕННОЙ

Выполняет эту функцию при изменении значения переменной ИМЯ_ПЕРЕМЕННОЙ. Обратите внимание, что 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

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

Важно отметить, что это не capture ссылающихся переменных или области видимости на момент объявления функции! На данный момент 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, который генерируется при очистке командной строки (используется для интеграции с терминальной оболочкой).

Функции не могут иметь то же имя, что и зарезервированное ключевое слово. Это элементы синтаксиса 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, см. Функции.

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

Spec-Zone.ru

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