Скажите, пожалуйста, как экспортировать функцию в родительскую оболочку (bash, sh или ksh), чтобы функция была доступна для всех дочерних процессов, запущенных из родительского процесса?
Приостановлено до дальнейшего уведомления. источник
2
экспортируемая функция доступна только для дочерних вызовов? Как применить его к текущему сеансу bash? нравится писать .bashrc, но только для текущего экземпляра bash ...
vp_arth
3
@vp_arth: если вам не нужна функция в дочерних вызовах, вам не нужно ее экспортировать. В любом случае он доступен в текущем сеансе (обратите внимание, что если он определен в файле, вам нужно будет исходить из файла, а не запускать его, чтобы сделать его доступным в текущем сеансе).
Вы можете использовать переменную окружения FPATH, в которой вы можете разместить все свои функции.
Если FPATHустановлено в интерактивном интерпретаторе, и команда или функция не найдены в текущей среде оболочки или PATHв каталогах, перечисленных там, выполняется поиск файла, названного в честь отсутствующей команды. Если он найден, он берется из текущей среды оболочки и должен определять функцию.
Итак, вы можете разместить все свои функции в определенном месте FPATH, и дочерние скрипты также смогут его найти.
Вы можете использовать autoloadкоманду в сценариях оболочки для загрузки требуемых функций:
autoload fun_a fun_b
В zsh autoloadтребуется для FPATHработы. In kshи его близкие родственники, я считаю, что это просто заставляет функции, определенные в, FPATHпереопределять обычную команду в вашем PATH, как если бы они были определены напрямую.
Если вы создаете подоболочки с помощью, ( )они унаследуют моментальный снимок всех определений, параметров и переменных оболочки.
Если вы выполняете их как программы, вы можете вставить определения в .bashrc.
Если вы пытаетесь подделать существующий сценарий для выполнения оболочки или подстановки для команды PATH, это .bashrcбудет работать в зависимости от деталей выполнения. В противном случае вы могли бы вместо этого выполнить сценарий оболочки, который просто выполняет подключаемый файл .или sourceвключаемый файл, который определяет функции, а затем делает то же самое со сценарием оболочки с заменяемыми командами.
Скрипт-оболочка может выглядеть примерно так:
script=$1shift
. include.sh
. $script"$@"
Идея состоит в том, что первый параметр - это имя реального сценария, а остальные параметры - это аргументы, тогда вместо этого запускается приведенный выше сценарий.
Обратите внимание, что это относится кbash . ( kshАналог «s в declare, typeset, есть -xвариант, но это относится только к переменным , а не функции, поддакивать для zsh).
mklement0 09
0
Функции по своей природе не экспортируются. Однако вы можете экспортировать строки, поэтому у меня есть небольшая хитрость:
func="$(typeset -f funcname)"export func
Чтобы импортировать функцию, заново определите ее из экспортированной строки:
Ответы:
Эта
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
работы. Inksh
и его близкие родственники, я считаю, что это просто заставляет функции, определенные в,FPATH
переопределять обычную команду в вашем PATH, как если бы они были определены напрямую.Некоторые подробности о
FPATH
иautoload
:источник
Если вы создаете подоболочки с помощью,
( )
они унаследуют моментальный снимок всех определений, параметров и переменных оболочки.Если вы выполняете их как программы, вы можете вставить определения в
.bashrc
.Если вы пытаетесь подделать существующий сценарий для выполнения оболочки или подстановки для команды PATH, это
.bashrc
будет работать в зависимости от деталей выполнения. В противном случае вы могли бы вместо этого выполнить сценарий оболочки, который просто выполняет подключаемый файл.
илиsource
включаемый файл, который определяет функции, а затем делает то же самое со сценарием оболочки с заменяемыми командами.Скрипт-оболочка может выглядеть примерно так:
script=$1 shift . include.sh . $script "$@"
Идея состоит в том, что первый параметр - это имя реального сценария, а остальные параметры - это аргументы, тогда вместо этого запускается приведенный выше сценарий.
источник
declare -x -f NAME
Больше информации
источник
bash
. (ksh
Аналог «s вdeclare
,typeset
, есть-x
вариант, но это относится только к переменным , а не функции, поддакивать дляzsh
).Функции по своей природе не экспортируются. Однако вы можете экспортировать строки, поэтому у меня есть небольшая хитрость:
func="$(typeset -f funcname)" export func
Чтобы импортировать функцию, заново определите ее из экспортированной строки:
# in subshell eval "$func"
источник