【问题标题】:How to export an environment variable for children processes inside a ksh script?如何为 ksh 脚本中的子进程导出环境变量?
【发布时间】:2013-08-23 12:51:20
【问题描述】:

我正在开发一个旧的C 软件。有一个ksh 脚本执行C 程序,然后创建一些其他进程并结束。这些进程仍然存在。

我正在尝试在我的 ksh 脚本中设置一个环境变量,以便可以在新创建的仍处于活动状态的进程中访问它。

我试过这种方法:

#!/bin/ksh

VARIABLE=value
export VARIABLE

my_c_program

但这不起作用......我已经尝试过:

  1. 将我的 ksh 脚本更改为 bash
  2. 创建一个包装脚本,用于创建和导出变量,然后执行原始 ksh 脚本(它只执行 C 程序)
  3. 采购我的 ksh 脚本(或尝试使用 2 时的包装脚本)而不是执行 它

但没有任何效果。

目前唯一有效的是当我明确地手动执行命令时:

export VARIABLE

在当前的 bash 终端中。

为什么?难道不能在脚本中进行导出而不是手动进行吗?

【问题讨论】:

  • 如何从 C 程序中读取环境变量?
  • 使用 getenv("VARIABLE") 它在从当前 bash 显式导出时按我所说的那样工作,在所有其他情况下都不起作用(返回 NULL)。

标签: c bash variables ksh environment


【解决方案1】:

其实一切都还好……

事实上,我认为是在我的 ksh 脚本中执行的 C 程序的子进程是之前执行的另一个进程的子进程。 C 程序只是通过共享内存发送一条消息,告诉其他程序执行它的子程序。

确实,环境变量从未从我的 C 程序传递给其他人的子程序。我在子级中设置该变量的唯一时间是当我在导出变量的 shell 中执行另一个程序(即子级的真正父级)时。

【讨论】:

    【解决方案2】:

    上面的代码看起来是正确的,它应该可以工作。另一种方法是:

    VARIABLE=value my_c_program
    

    仅为程序导出变量。之后,变量将被设置,但其他外部进程不会得到副本。

    那么为什么你的脚本不起作用?很难说,但这里有一些调试问题的提示:

    1. 使用#!/bin/ksh -x 启用调试输出。将输出保存在一个文件中,然后grep VARIABLE 看看会发生什么。

    2. 检查拼写错误。

    3. 另一个 shell 脚本就像一个外部进程。所以创建一个脚本

      #!/bin/ksh
      
      echo $VARIABLE
      

      并调用它而不是 my_c_program 只是为了确保传递变量有效。

    4. 也许 C 做了一些意想不到的事情。使用调试器确保它符合您的预期。

    【讨论】:

    • 在我的 shell 中尝试使用 shell 脚本表明导出有效。更糟糕 !我尝试使用 gdb -x 在我的 ksh 脚本中执行程序以在它结束之前中断它,并且在中断它时,变量已设置!我尝试了 2 个变量,它们都在我的 ksh 脚本中导出,并且只有一个在当前 shell 中手动导出。都是在ksh脚本里设置的,都是在第一个C程序里设置的,只有我自己手动设置的那个是在子进程里设置的……大概是C代码做奇怪的事情吧,不过是个庞大的软件,近百万行,难以调试。
    • 顺便感谢您提供的所有这些提示 :)
    • getenv()execve() 中设置断点(后者允许覆盖子进程的环境变量)
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2017-12-25
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多