2

У меня есть файл bash, src-useful.bash , содержащий полезные функции, такие как say_hello() , расположенный в /path /to / полезно.

В моем ~/.bash_profile я добавил следующие строки:

export BASH_USEFUL=/path/to/useful
source $BASH_USEFUL/src-useful.bash

Открывая новый терминал, я могу проверить следующее:

$ echo $BASH_USEFUL
/path/to/useful

$ cat $BASH_USEFUL/src-useful.bash
function hello() {
    echo "hello!"
}

$ hello
hello!

Я создал скрипт, say_hello.sh:

$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
hello

$ ./say_hello.sh
BASH_USEFUL: /path/to/useful  # Recognizsed
say_hello.sh: line 2: say_hello: command not found  # Not recognized?

Если я $BASH_USEFUL/src-useful.bash в say_hello.sh он будет работать:

$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
source $BASH_USEFUL/src-useful
say_hello

$ ./say_hello.sh
BASH_USEFUL: /path/to/useful  # Recognized
hello!  # Function say_hello is now recognized

Я хотел бы знать, почему переменная BASH_USEFUL все еще распознается моим сценарием, а функции из моего исходного файла не могут быть видны в среде моим запущенным сценарием. Есть ли обходной путь, кроме поиска моего src-useful.bash в моих скриптах? Я бы хотел, чтобы функции src-useful.bash загружались в среде любого запускаемого мной скрипта.

1 ответ1

3

Только экспортированные элементы среды копируются в новые дочерние среды. Вы экспортировали BASH_USEFUL поэтому этот env-var будет скопирован в ваш ./say_hello.sh как и ожидалось. Но вы не сделали то же самое для своей функции hello() которая затем является простым локальным символом, который нельзя копировать в новых дочерних средах.

Синтаксис для экспорта функций с использованием bash использует аргумент -f для export:

export -f hello

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .