функция - создание функции
Краткое описание
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_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 в другой.
© 2020 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.2/cmds/function.html