如何使用execve导出环境变量

时间:2011-10-06 04:01:20

标签: c

我想弄清楚如何将这个环境变量从我的minishell导出到bash。使用此代码导出时没有任何反应。我做错了吗

      if(strcmp(istring, "myexport") ==0)     //This command shows parent enviornment
  {
      char * const *junk;
      execve("/bin/bash" , junk , myexp);
      return(1);
  }          

3 个答案:

答案 0 :(得分:2)

尝试

char *const argv = { "-c", "env", 0 };
char *const env = { "PATH=/bin", "USER=wibble", 0 };

execve("/bin/bash", argv, env);

当然,您可以使用extern char **environ;getenv为新二进制文件/脚本构建环境,从而获取现有环境。

答案 1 :(得分:1)

如果要运行bash以便在shell中设置环境,则会误解环境的设置方式。

其他答案中确定了编码问题:

  • 您没有初始化junk
  • 您没有显示初始化myexp的方式。

假设您已经过了这些问题,那么更深层的是子进程不会影响父进程的环境。当shell导出环境变量时,它会通过调整提供给它执行的每个命令的列表来实现,但它是在shell内部处理的,而不是通过执行任何外部命令来处理。

此外,如果显示的片段未在子进程中运行(在fork()之后),那么您还有另一个问题;命令执行成功后,execve()不会返回。

因此,要导出环境变量,更改将在主shell中进行,而不是在子进程中进行。

答案 2 :(得分:0)

你将一个未初始化的指针作为execve的第二个参数传递 - 很可能会因EFAULT而失败,但如果它以某种方式神奇地成功,bash将会在其argv参数数组中看到垃圾并做一些奇怪的事情(很可能抱怨某些垃圾文件不存在)。

如果您不想传递任何参数,请传入指向NULL的指针,但最好至少将正在执行的程序的名称传递为argv[0]

char *const argv[] = {"bash", NULL};
execve("/bin/bash", argv, myexp);

另外,myexp是什么?它是一个指向NULL终止指向数组FOO=BAR字符串的指针数组的指针吗?