Скажите, пожалуйста, как экспортировать функцию в родительскую оболочку (bash, sh или ksh), чтобы функция была доступна для всех дочерних процессов, запущенных из родительского процесса?
Скажите, пожалуйста, как экспортировать функцию в родительскую оболочку (bash, sh или ksh), чтобы функция была доступна для всех дочерних процессов, запущенных из родительского процесса?
Ответы:
Эта export -f
функция специфична для Bash:
родитель
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
ребенок
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
В sh
, это не возможно экспортировать функцию, как и отметил Чарльз Даффи .
Если вы используете ksh или zsh:
Вы можете использовать переменную окружения FPATH
, в которой вы можете разместить все свои функции.
Если FPATH
установлено в интерактивном интерпретаторе, и команда или функция не найдены в текущей среде оболочки или PATH
в каталогах, перечисленных там, выполняется поиск файла, названного в честь отсутствующей команды. Если он найден, он берется из текущей среды оболочки и должен определять функцию.
Итак, вы можете разместить все свои функции в определенном месте FPATH
, и дочерние скрипты также смогут его найти.
Вы можете использовать autoload
команду в сценариях оболочки для загрузки требуемых функций:
autoload fun_a fun_b
В zsh autoload
требуется для FPATH
работы. In ksh
и его близкие родственники, я считаю, что это просто заставляет функции, определенные в, FPATH
переопределять обычную команду в вашем PATH, как если бы они были определены напрямую.
Некоторые подробности о FPATH
и autoload
:
Если вы создаете подоболочки с помощью, ( )
они унаследуют моментальный снимок всех определений, параметров и переменных оболочки.
Если вы выполняете их как программы, вы можете вставить определения в .bashrc
.
Если вы пытаетесь подделать существующий сценарий для выполнения оболочки или подстановки для команды PATH, это .bashrc
будет работать в зависимости от деталей выполнения. В противном случае вы могли бы вместо этого выполнить сценарий оболочки, который просто выполняет подключаемый файл .
или source
включаемый файл, который определяет функции, а затем делает то же самое со сценарием оболочки с заменяемыми командами.
Скрипт-оболочка может выглядеть примерно так:
script=$1
shift
. include.sh
. $script "$@"
Идея состоит в том, что первый параметр - это имя реального сценария, а остальные параметры - это аргументы, тогда вместо этого запускается приведенный выше сценарий.
declare -x -f NAME
Больше информации
-f ограничить действие или отображение именами и определениями функций -x для экспорта ИМЕНИ
bash
. ( ksh
Аналог «s в declare
, typeset
, есть -x
вариант, но это относится только к переменным , а не функции, поддакивать для zsh
).