【问题标题】:Passing the environment variables to the launched process bash script将环境变量传递给启动的进程 bash 脚本
【发布时间】:2013-06-11 08:59:41
【问题描述】:

在 linux 下,我有一个 bash 脚本,它启动一个 c++ 程序二进制文件。 我需要做的是在该脚本中设置一个环境变量,并访问该变量 在使用 getenv 启动的 C++ 程序中。

这是脚本的代码

#!/bin/bash
export SAMPLE_VAR=1
./c++_binary

c++ 程序:

char * env_var = getenv("SAMPLE_VAR");
if (env_var != NULL) printf("var set\n");

但是这似乎不起作用。据我了解,当我们执行脚本时,它将在一个新的子shell中运行并在那里设置环境变量 SAMPLE_BAR,但是 C++ 二进制文件也在同一个子shell中启动(可能我在这里错了)所以它应该可以访问 SAMPLE_VAR。我什至尝试编写一个单独的脚本来设置 env 变量,在主脚本中我将该脚本称为 source env_var_set.sh 无济于事。

是否可以通过这种方式将新设置的环境变量传递给程序? 谢谢

【问题讨论】:

  • 您的意思是char * env_var = getenv("SAMPLE_VAR")?额外的引号可以使一切变得不同。
  • 你也试过int main(int argc, char **argv, char **envp);吗? envp 也应该捕获环境变量。
  • @mvp,是的,抱歉,我确实添加了引号,编辑了任务。
  • 这很奇怪——你做对了,它应该可以正常工作。关于如果你有一些安全软件在工作时它不会的唯一原因,比如AppArmor
  • 您的问题提到了 SAMPLE_VAR 和 SAMPLE_BAR;您的最后一条评论提到了 SAMPE_VAR。你必须让你的拼写保持一致。您的代码应该可以正常工作。您的脚本也可以使用:SAMPLE_VAR=1 ./c++_binary,它只将变量导出到一个程序。

标签: c++ linux bash shell


【解决方案1】:

由于对mark a comment as an answer 的功能请求仍然被拒绝,我在此处复制上述解决方案。

对不起,错字,我的错误,在脚本中,我使用 'sudo' 启动二进制文件,它在 root 的 env 中运行它并且没有在那里设置变量。删除了 sudo ,它工作正常。对困惑感到抱歉。干杯。 ——阿卜杜拉

【讨论】:

    【解决方案2】:

    首先,您需要source 您的shell 脚本才能设置env 变量。其次,在getenv 调用中包含引号。

    char * env_var = getenv("SAMPLE_VAR");
    if (env_var != NULL) printf("var set\n");
    

    【讨论】:

    • 他正在导出变量并从同一个脚本启动二进制文件。采购与执行脚本不会有任何区别。
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多