2017-04-01 344 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