У меня есть скрипт, в котором много функций.
мойфайл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
это не специфично для оболочки.sh
export -f
bash
Если в скрипте нет 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
, и тогда вам не придется экспортировать никакие функции.
Обратите внимание, что в системах, где sh
is bash
, экспортировать функции, вероятно, не очень хорошая идея, так как это влияет на все скрипты sh и bash и командные строки оболочки, которые ваш скрипт выполняет (рекурсивно). Например, если вы сделали:
set -o allexport
uname() { echo Gotcha; }
somecmd
И somecmd
делал popen("uname", "r")
для получения имени unix, он получал бы Gotcha
в системах, где sh
вместо bash
настоящего имени системы ( Darwin
, Linux
...).