Как «экспортировать» функции в bash?

Как «экспортировать» функции в bash?

У меня есть скрипт, в котором много функций.

мойфайл1.sh:

func1() {}

func2() {}

Я могу вызвать их из скрипта с помощью:

мойфайл2.sh:

source myfile1.sh

func1

func2

Но как я могу вызвать их, если они находятся во вложенном скрипте?

мойфайл3.sh:

./myfile2.sh

func2

func2: command not found

Могу ли я «экспортировать» функции из myfile2, чтобы все их знали?

Я не могу использовать, export -fтак как там много функций.

решение1

Обратите внимание , что bashэто не специфично для оболочки.shexport -fbash

Если в скрипте нет she-bang, он будет интерпретироваться оболочкой POSIX, которая может быть не bash. Если вы собираетесь использовать bashв своем скрипте специфичные для него функции, вам следует убедиться, что в нем есть:

#! /path/to/bash -

she-bang или что вы вызываете его как bash path/to/the/script. Также предоставление .shрасширений скриптам, написанным на этом bashязыке, немного вводит в заблуждение.

Now bash— одна из немногих оболочек, способных экспортировать функции в среду (фактически используя специальные переменные среды, понятные bashтолько командам). Это можно сделать с помощью export -fспецифичной для bash команды. bashтакже экспортирует все функции, объявленные при allexportвключенной опции.

Но в любом случае ни один из них не будет работать в вашем случае. exportСоздание чего-либо из одной оболочки, будь то переменная или функция, заключается в том, чтобы эта переменная/функция была доступна в других оболочках, которые эта оболочкавыполняет(экспорт заключается в сохранении вещей черезисполнение).

Так что даже если бы myfile1.shили myfile2.shэкспортировали функции, которые они объявили (с export -fили , имея set -o allexportперед объявлением переменной), это повлияло бы только на оболочки, которые оболочка, интерпретирующая эти скрипты, выполнила бы. Здесь myfile2.shне выполняется myfile3.sh, все наоборот.

Здесь вам понадобится ваш myfile3.shскрипт для выполнения следующих действий:

source path/to/myfile2.sh

так что это будет одна и та же оболочка, которая интерпретирует код во всех скриптах myfile1.sh, myfile2.shи myfile3.sh, и тогда вам не придется экспортировать никакие функции.

Обратите внимание, что в системах, где shis bash, экспортировать функции, вероятно, не очень хорошая идея, так как это влияет на все скрипты sh ​​и bash и командные строки оболочки, которые ваш скрипт выполняет (рекурсивно). Например, если вы сделали:

set -o allexport
uname() { echo Gotcha; }
somecmd

И somecmdделал popen("uname", "r")для получения имени unix, он получал бы Gotchaв системах, где shвместо bashнастоящего имени системы ( Darwin, Linux...).

Связанный контент