linux
  • bash
  • environment-variables
  • setenv
  • shellshock-bash-bug
  • 2014-10-10 61 views 3 likes 
    3

    我需要从C/C++程序在Bash环境中定义Bash函数。在环境中设置Bash函数

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

    或者

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

    但使用猛砸版:弹震错误之前,我可以这样定义一个函数:

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

    或从C程序等同与shellshock固定,我不能管理如何在环境中定义我的功能。

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

    在此先感谢

    +1

    奇怪:人谁知道内部和无证的方式导出函数,不知道用的记录方式'declare'或'export' ... – jm666 2014-10-10 07:36:58

    +2

    @ jm666,已经知道''export -f'',但我需要从C程序中编程执行。我不知道如何从C程序中将函数定义导出到没有“putenv”或“setenv”的环境中。感谢您的回答 – JoseLSegura 2014-10-10 07:41:29

    +0

    以便携的方式做这样的事情要好得多,在没有'bash'的环境中,像普通的旧shell,破折号,ksh,zsh等等。因此,您可能希望以@starrify已经告诉您的方式来源他们... – jm666 2014-10-10 07:59:07

    回答

    2

    如果您正在使用execv调用bash(这样你只调用一次),你可以(使用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的优势。

    (我不得不作出类似的补丁各种方案,让我分担你的痛苦。)

    6

    仅供参考。由于没有文档记录功能如何导出到环境中,因此您应该将其视为滥用私人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); 
    
    +0

    可能是相关的:[通过专门制作的环境变量的Bash代码注入漏洞](https://access.redhat.com/articles/1200223) – anishsane 2014-10-10 13:54:05

    +0

    从Java中解析整个软件的工作programa,我不能使用提供的语法来设置函数定义。使用'env'它可以工作。 – 2017-11-20 15:03:32

    相关问题