2011-10-06 59 views
0

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

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

你不初始化'垃圾',为什么?什么是myexp? –

+0

您所做的更改仅在执行该bash副本时适用。 –

回答

0

你传递一个未初始化的指针作为第二个参数execve - 大多数有可能的,这将失败,并EFAULT,但如果它神奇地成功,bash会看到垃圾它的argv阵列的参数和做一些奇怪的事情(最有可能抱怨某些垃圾文件不存在)。

如果你不想传递任何参数,在一个指针传递给NULL,但它是很好的做法,在程序的名称至少传递作为argv[0]执行:

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

而且, myexp是什么?它是一个指向NULL的指针 - 指向FOO=BAR形式的字符串的指针数组?

+0

谢谢。这就是myexp的意思。我尝试了你的代码,但它仍然没有工作.myexp: for(i = 0; i <100; i ++) { myexp [100] = NULL; } – user981536

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

argv和env应该是字符串数组,您将它们声明为常量字符串。 – Dave

1

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

还有在其他的答案中确定的编码问题:

  • 你不初始化junk
  • 您不显示如何初始化myexp

虽然假设你已经过去了这些问题,但更深的一点是子进程不会影响父进程的环境。当一个shell导出一个环境变量时,它通过调整提供给它执行的每个命令的列表来实现,但是它在shell内部处理,而不是通过执行任何外部命令。另外,如果所显示的片段未在子进程中运行(在fork()之后),那么您还有其他问题;当命令成功执行时,execve()不会返回。

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