Установить функцию Bash для среды

Мне нужно определить функцию Bash в среде Bash из программы на C/C++. До ошибки в снаряде я мог определить функцию следующим образом:

my_func='() { echo "This is my function";}'

Или эквивалент из программы на C:

setenv("my_func", "() { echo \"This is my function\";}", 1);

Или же

putenv("my_func=() { echo \"This is my function\";}");

Но, используя версию Bash с исправленным шеллшоком, я не могу понять, как определить свои функции в среде.

Странная вещь, если я бегу envЯ вижу, что моя функция определена в среде, но если я ее вызываю, Баш говорит, что ее не существует.

заранее спасибо

2 ответа

Решение

Если вы вызываете bash с execv (так что вы вызываете его только один раз), вы можете заменить (используя execl для пояснения):

 execl("/bin/bash", "bash", "file_to_run", "arg1", "arg2", 0);

с

 execl("/bin/bash", "bash", "-c", "f() {...} g() {...}\n. $0",
                    "file_to_run", "arg1", "arg2", 0);

и тогда вам не нужно играть в игры с внутренним интерфейсом bash для определения функций. (Если выполняемый скрипт bash также требует экспорта функций по какой-либо причине, просто добавьте export -f <func> строки к аргументу после -c.)

Это имеет преимущество работы как с исправленными, так и без исправлений.

(Я должен сделать аналогичный патч для различных программ, поэтому я разделяю вашу боль.)

Только для ознакомительных целей. Поскольку не задокументировано, как функции экспортируются в среду, вы должны рассматривать это как злоупотребление частным API, который может быть изменен в будущих версиях bash,

Функции больше не экспортируются, используя просто имя функции в строке окружения. Чтобы увидеть это, запустите

$ my_func () { echo "foo"; }
$ export -f my_func
$ env | grep -A1 'my_func'
BASH_FUNC_my_func%%=() {  echo "foo"
}

Поскольку имя, используемое в среде, больше не является действительным bash идентификатор, вам нужно будет использовать env Команда для изменения среды нового процесса.

env 'BASH_FUNC_my_func%%=() { echo "This is my function"; }' bash

От C, вам просто нужно изменить имя.

setenv("BASH_FUNC_my_func%%", "() { echo \"This is my function\";}", 1);
Другие вопросы по тегам