Установить функцию 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);