функция - создать функцию
Синтаксис
function NAME [OPTIONS]; BODY; end
Описание
function создаёт новую функцию ИМЯ с телом ТЕЛО.
Функция — это список команд, которые будут выполнены, когда имя функции используется как команда.
Доступны следующие параметры:
- -a ИМЕНА или --argument-names ИМЕНА
-
Присваивает значение последовательных аргументов командной строки именам, указанным в ИМЕНА.
- -d ОПИСАНИЕ или --description ОПИСАНИЕ
-
Описание того, что делает функция, подходящее для описания автодополнения.
- -w ОБЕРНУТАЯ_КОМАНДА или --wraps ОБЕРНУТАЯ_КОМАНДА
-
Наследует автодополнение от заданной ОБЕРНУТОЙ_КОМАНДЫ. Для получения дополнительной информации см. документацию по complete.
- -e ИМЯ_СОБЫТИЯ или --on-event ИМЯ_СОБЫТИЯ
-
Выполняет эту функцию при возникновении указанного именованного события. Внутренне Fish генерирует именованные события, например, при отображении приглашения. Пользовательские события можно генерировать с помощью команды emit.
- -v ИМЯ_ПЕРЕМЕННОЙ или --on-variable ИМЯ_ПЕРЕМЕННОЙ
-
Выполняет эту функцию при изменении значения переменной ИМЯ_ПЕРЕМЕННОЙ. Обратите внимание, что 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
-
Разрешает функции получать доступ к переменным вызывающих функций. Обычно любые переменные внутри функции, имеющие то же имя, что и переменные из вызывающей функции, «затеняются», и их содержимое независимо от вызывающей функции.
Важно отметить, что это не capture ссылающихся переменных или области видимости на момент объявления функции! На данный момент 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, который генерируется при очистке командной строки (используется для интеграции с терминальной оболочкой).
Функции не могут иметь то же имя, что и зарезервированное ключевое слово. Это элементы синтаксиса 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, см. Функции.
© 2022 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.5/cmds/function.html