我想弄清楚如何将这个环境变量从我的minishell导出到bash。使用此代码导出时没有任何反应。我做错了吗
if(strcmp(istring, "myexport") ==0) //This command shows parent enviornment
{
char * const *junk;
execve("/bin/bash" , junk , myexp);
return(1);
}
答案 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
字符串的指针数组的指针吗?