функция - создание функции
Краткое описание
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