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