Функция - создание функции
Описание
function NAME [OPTIONS]; BODY; end
Описание
function создаёт новую функцию NAME с телом BODY.
Функция представляет собой список команд, которые будут выполнены при вводе имени функции как команды.
Доступны следующие параметры:
-
-a NAMESили--argument-names NAMESприсваивает значения последовательных аргументов командной строки именам, указанным в NAMES. -
-d DESCRIPTIONили--description=DESCRIPTIONописывает действие функции, подходит для описания завершения. -
-w WRAPPED_COMMANDили--wraps=WRAPPED_COMMANDпозволяет функции наследоваться от завершений указанной обернутой команды. Подробнее см. документацию для complete. -
-eили--on-event EVENT_NAMEсообщает fish о выполнении этой функции при возникновении указанного имени события. Fish внутренне генерирует имена событий, например, при отображении приглашения. -
-vили--on-variable VARIABLE_NAMEсообщает fish о выполнении этой функции при изменении значения переменной VARIABLE_NAME. Обратите внимание, что fish не гарантирует никакого конкретного времени или даже того, что функция будет выполнена для каждогоset. Вместо этого она будет выполнена, когда переменная будет установлена хотя бы один раз, возможно, пропустив некоторые значения или будучи выполненной, когда переменная была установлена в то же значение (за исключением универсальных переменных, установленных в других оболочках — изменения в значении будут учтены только для них). -
-j PIDили--on-job-exit PIDсообщает fish о выполнении этой функции при завершении задачи, содержащей дочерний процесс с заданным PID. Вместо PID можно указать строку 'caller'. Это разрешено только при использовании подстановки команд и приведет к тому, что обработчик будет запущен при завершении задачи, создавшей эту подстановку команд. -
-p PIDили--on-process-exit PIDсообщает fish о выполнении этой функции при завершении дочернего процесса fish с процессом ID PID. Вместо PID, для обратной совместимости, может быть указано "%self" как псевдоним для$fish_pid, и функция будет выполнена при завершении текущей инстанции fish. -
-sили--on-signal SIGSPECсообщает fish о выполнении этой функции при доставке сигнала SIGSPEC. SIGSPEC может быть номером сигнала или именем сигнала, например SIGHUP (или просто HUP). -
-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, см. Функции.
© 2021 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.3/cmds/function.html