首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在环境中设置Bash函数

在环境中设置Bash函数
EN

Stack Overflow用户
提问于 2014-10-10 07:19:59
回答 2查看 5.2K关注 0票数 4

我需要从C/C++程序中在Bash环境中定义一个Bash函数。在贝类攻击之前,我可以这样定义一个函数:

代码语言:javascript
复制
my_func='() { echo "This is my function";}'

或与C程序等效:

代码语言:javascript
复制
setenv("my_func", "() { echo \"This is my function\";}", 1);

代码语言:javascript
复制
putenv("my_func=() { echo \"This is my function\";}");

但是使用Bash版本修复using休克,我无法管理如何在环境中定义我的函数。

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

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-10 16:11:46

如果您使用bash调用execv (因此您只调用它一次),您可以替换(为了解释目的使用execl ):

代码语言:javascript
复制
 execl("/bin/bash", "bash", "file_to_run", "arg1", "arg2", 0);

使用

代码语言:javascript
复制
 execl("/bin/bash", "bash", "-c", "f() {...} g() {...}\n. $0",
                    "file_to_run", "arg1", "arg2", 0);

然后您就不需要使用内部bash接口来定义函数了。(如果运行中的bash脚本也需要导出函数,则只需将export -f <func>行添加到-c后面的参数中即可。)

这样做的优点是既可以处理补丁,也可以处理未修补的便签。

(我不得不为不同的节目做一个类似的补丁,所以我和你一样痛苦。)

票数 2
EN

Stack Overflow用户

发布于 2014-10-10 13:20:51

仅供参考之用。由于未记录函数是如何导出到环境中的,因此您应该将其视为对可能在未来版本的bash中更改的私有API的滥用。

函数不再仅使用环境字符串中函数的名称导出。要看这个,快跑

代码语言:javascript
复制
$ my_func () { echo "foo"; }
$ export -f my_func
$ env | grep -A1 'my_func'
BASH_FUNC_my_func%%=() {  echo "foo"
}

由于环境中使用的名称不再是有效的bash标识符,因此需要使用env命令来修改新进程的环境。

代码语言:javascript
复制
env 'BASH_FUNC_my_func%%=() { echo "This is my function"; }' bash

从C中,只需调整名称.​​​​​​

代码语言:javascript
复制
setenv("BASH_FUNC_my_func%%", "() { echo \"This is my function\";}", 1);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26293949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档