Скажите, пожалуйста, как экспортировать функцию в родительскую оболочку (bash, sh или ksh), чтобы функция была доступна для всех дочерних процессов, запущенных из родительского процесса?
Экспорт функции в оболочку
Ответ 1
Функция export -f
относится к Bash:
родителя
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
ребенок
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
Ответ 2
В sh
возможно экспортировать функцию не, как отмеченную Чарльзом Даффи.
Ответ 3
Если вы используете ksh или zsh:
Вы можете использовать переменную окружения FPATH
, в которой вы можете разместить все свои функции.
Если FPATH
задано в интерактивном интерпретаторе, а команда или функция не найдены в текущей среде оболочки или PATH
, в перечисленных там каталогах поиск существует для файла с именем после пропущенной команды, Если он найден, он будет найден в текущей среде оболочки и, как ожидается, определит функцию.
Итак, вы можете разместить все свои функции в месте в FPATH
, и его также смогут найти дочерние скрипты.
Вы можете использовать команду autoload
в сценариях оболочки для загрузки необходимых вам функций:
autoload fun_a fun_b
В zsh для FPATH
требуется FPATH
. В ksh
и его близких родственниках я считаю, что это просто заставляет функции, определенные в FPATH
, переопределять регулярную команду в ваш PATH, как если бы они были определены напрямую.
Некоторые сведения о FPATH
и autoload
:
Ответ 4
Если вы создаете подоболочки с ( )
, тогда они наследуют моментальный снимок всех определений, параметров и переменных оболочки.
Если вы выполняете их как программы, вы можете поместить определения в .bashrc
.
Если вы пытаетесь подделать существующий script для выполнения оболочки или подстановки для команды PATH, тогда .bashrc
будет работать в зависимости от деталей выполнения. Если нет, вы можете вместо этого выполнить оболочку script, которая просто выполняет .
или source
файла include, который определяет функции, а затем делает то же самое с оболочкой script с заменяемыми командами.
Оболочка script может выглядеть примерно так:
script=$1
shift
. include.sh
. $script "[email protected]"
Идея заключается в том, что первым параметром является имя реального script, а остальные параметры - это args, тогда вместо этого выполняется script.
Ответ 5
declare -x -f NAME
Дополнительная информация
-f restrict action or display to function names and definitions -x to make NAMEs export
Ответ 6
Функции не экспортируются по своей природе. Однако вы можете экспортировать строки, поэтому у меня есть небольшой трюк:
func="$(typeset -f funcname)"
export func
Чтобы импортировать функцию, переопределите ее из экспортируемой строки:
# in subshell
eval "$func"