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

87

Скажите, пожалуйста, как экспортировать функцию в родительскую оболочку (bash, sh или ksh), чтобы функция была доступна для всех дочерних процессов, запущенных из родительского процесса?

Сачин Чурасия
источник
1
unix.stackexchange.com/questions/22796/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

105

Эта 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
экспортируемая функция доступна только для дочерних вызовов? Как применить его к текущему сеансу bash? нравится писать .bashrc, но только для текущего экземпляра bash ...
vp_arth
3
@vp_arth: если вам не нужна функция в дочерних вызовах, вам не нужно ее экспортировать. В любом случае он доступен в текущем сеансе (обратите внимание, что если он определен в файле, вам нужно будет исходить из файла, а не запускать его, чтобы сделать его доступным в текущем сеансе).
Приостановлено до дальнейшего уведомления.
3

Если вы используете ksh или zsh:

Вы можете использовать переменную окружения FPATH, в которой вы можете разместить все свои функции.

Если FPATHустановлено в интерактивном интерпретаторе, и команда или функция не найдены в текущей среде оболочки или PATHв каталогах, перечисленных там, выполняется поиск файла, названного в честь отсутствующей команды. Если он найден, он берется из текущей среды оболочки и должен определять функцию.

Итак, вы можете разместить все свои функции в определенном месте FPATH, и дочерние скрипты также смогут его найти.

Вы можете использовать autoloadкоманду в сценариях оболочки для загрузки требуемых функций:

autoload fun_a fun_b

В zsh autoloadтребуется для FPATHработы. In kshи его близкие родственники, я считаю, что это просто заставляет функции, определенные в, FPATHпереопределять обычную команду в вашем PATH, как если бы они были определены напрямую.

Некоторые подробности о FPATHи autoload:

Венкатарамеш Коммоджу
источник
1

Если вы создаете подоболочки с помощью, ( )они унаследуют моментальный снимок всех определений, параметров и переменных оболочки.

Если вы выполняете их как программы, вы можете вставить определения в .bashrc.

Если вы пытаетесь подделать существующий сценарий для выполнения оболочки или подстановки для команды PATH, это .bashrcбудет работать в зависимости от деталей выполнения. В противном случае вы могли бы вместо этого выполнить сценарий оболочки, который просто выполняет подключаемый файл .или sourceвключаемый файл, который определяет функции, а затем делает то же самое со сценарием оболочки с заменяемыми командами.

Скрипт-оболочка может выглядеть примерно так:

script=$1
shift
. include.sh
. $script "$@"

Идея состоит в том, что первый параметр - это имя реального сценария, а остальные параметры - это аргументы, тогда вместо этого запускается приведенный выше сценарий.

DigitalRoss
источник
2
Не могли бы вы объяснить это на примере кода. Я не хочу помещать свою функцию в .bashrc
Sachin Chourasiya
1
declare -x -f NAME

Больше информации

-f ограничить действие или отображение именами и определениями функций
-x для экспорта ИМЕНИ
Стивен Пенни
источник
6
Обратите внимание, что это относится кbash . ( kshАналог «s в declare, typeset, есть -xвариант, но это относится только к переменным , а не функции, поддакивать для zsh).
mklement0 09
0

Функции по своей природе не экспортируются. Однако вы можете экспортировать строки, поэтому у меня есть небольшая хитрость:

func="$(typeset -f funcname)"
export func

Чтобы импортировать функцию, заново определите ее из экспортированной строки:

# in subshell
eval "$func"
iBug
источник