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