функция - создание функции
Синопсис
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 изменяет значение. -
-j PGIDили--on-job-exit PGIDсообщает fish о выполнении этой функции, когда работа с идентификатором группы PGID завершается. Вместо PGID можно указать строку 'caller'. Это допустимо только в подстановке команды и приведёт к тому, что обработчик будет срабатывать при завершении работы задания, создавшего эту подстановку команды. -
-p PIDили--on-process-exit PIDсообщает fish о выполнении этой функции, когда дочерний процесс fish с идентификатором процесса 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_command_not_found, который генерируется всякий раз, когда не удалось найти команду. -
fish_preexec, который генерируется непосредственно перед выполнением интерактивной команды. Командная строка передаётся в качестве первого параметра.Примечание: это событие будет генерироваться, даже если команда неверна. Параметр командной строки включает всю командную строку дословно и потенциально может включать новые строки.
-
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 в другой.
© 2019 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.1/cmds/function.html