2017-04-01 138 views
1

我正在制作自己的shell并设置了fork/exec的内容来执行程序。对于没有'/'的命令,我搜索带有可执行文件的目录的PATH环境。但是,当我尝试在shell中使用clear时,告诉我TERM环境变量未设置。我想知道是否有事情做与此:unix“clear”TERM环境变量未设置

execve(args[0], args, environ); 

其中ENVIRON =

char* environ[] = {NULL}; 

有什么我需要把在那里?不希望使用execvp。任何帮助表示赞赏

+0

是的,它与此有很大关系。您需要在环境中包含TERM和其他值 - HOME,PATH立即启发。检查POSIX的最小设置。 –

回答

1

shell应该为子进程提供自己的环境变量。事实上,几乎所有产卵的孩子都应该这样做。通常你会使用execv(注意缺少e),它不会将环境作为参数。

shell也是一种特殊情况,因为它是可以合法地在将环境传递给子级之前修改环境的过程之一。这意味着你可能最终需要execve,但是你不能简单地在那里传递一个固定数组。您需要管理您想要传递给子项的环境,在shell启动时加载自己的环境,在每个环境修改命令期间修改它,并将其作为environ传递。

+0

对不起,我对环境不太熟悉。加载自己的环境意味着什么?那是通过getenv使用保存一个变量,然后当我执行一个进程时,我将这个变量用变量 – ricefieldboy

+0

@ricefieldboy如果你一直修改自己的环境(而不是创建一个本地副本),那么你不需要做很多:那么当用户请求变量('echo $ HOME')时调用'getenv'并在用户请求修改变量('export var = foo')时调用'(un)setenv'即可。那么'execv'就足够了。但是,一旦添加了shell本地变量('var = foo'),这种方法就不起作用。当你添加这些变量时,你需要在你的程序中复制'getenv','setenv','unsetenv',并调整它们以搜索环境变量和shell本地变量。 – hvd