Экспорт функции в оболочку

Скажите, пожалуйста, как экспортировать функцию в родительскую оболочку (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)) )

Ответ 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"