在环境中设置Bash功能

时间:2014-10-10 07:19:59

标签: linux bash environment-variables setenv shellshock-bash-bug

我需要从C / C ++程序在Bash环境中定义一个Bash函数。在 shellshock 错误之前,我可以用这种方式定义一个函数:

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\";}");

但是使用修复了 shellshock 的Bash版本,我无法管理如何在环境中定义我的功能。

奇怪的是,如果我运行env,我可以看到我在环境中定义的函数,但是如果我调用它,Bash说它不存在。

提前致谢

2 个答案:

答案 0 :(得分:7)

仅供参考。由于未记录函数如何导出到环境,因此您应将此视为滥用私有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);

答案 1 :(得分: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行。)

这样做的好处是可以使用修补和未修补的bashes。

(我必须为各种程序制作类似的补丁,所以我分担你的痛苦。)