2016-07-07 60 views
0

我正在寫一個shell。什麼是最低要求的環境變量?

通過系統調用execvpe,我可以運行程序並控制其環境。我需要在這裏通過什麼最小值?

另外,我明白,子進程應該有一個父母的環境的副本,可能與一些值添加。在測試我的shell時,我從終端內部的窗口管理器等內的bash內運行它。我可以假設的基礎是什麼?如果我直接從TTY(「最低級別」,據我瞭解)運行我的shell,我可以期待什麼?

回答

2

這是一個非常廣泛的問題。在一定程度上, 程序應該能夠在沒有環境的情況下運行。

  • 「X」顯示(即GUI)程序需要知道 它們應該在哪裏顯示。 通常通過DISPLAY環境變量 提供此信息,但也可以在命令行上傳遞此信息。 可能有其他環境變量對於「X」程序來說至關重要的 (或幾乎如此);我已經看過那個引擎蓋,已經有一段時間了。
  • 任何需要使用終端的特殊特性的程序 都需要TERM環境變量。 「特殊特性」是指能夠設置顏色 (如lsgrep可以做,受期權), 移動屏幕(如vi/vim)左右, ,甚至不知道屏幕的尺寸(如less) 。 請注意,屏幕的大小也可以從 到ROWSCOLUMNS
  • 需要知道的日期和時間的任何程序 感知/由需要知道的時區(TZ)用戶理解 - 雖然,如果你願意與絕對工作(GMT/UTC) , 你不需要這個。

1

,你需要的是一個工作PATH變量最低。除此之外的任何額外功能都取決於您要執行的程序。

POSIX has a list of commonly-used environment variables,很少有程序使用其中的幾個。

通常,如果您使用的是execvp *,那麼您並未給出可執行文件的完整路徑名。它使您的程序更加簡單,您不必爲每個可執行文件提供完整的路徑名,正如普通文本所需要的那樣。POSIX描述了這些功能的

int execv(const char *path, char *const argv[]); 
int execvp(const char *file, char *const argv[]); 

和(指的各種EXEC *函數的參數):

的參數路徑指向標識新處理圖像文件的路徑名。

參數文件用於構建標識新過程映像文件的路徑名。如果文件參數包含一個斜槓字符,則應使用文件參數作爲此文件的路徑名。否則,通過搜索作爲環境變量PATH(請參閱XBD環境變量)傳遞的目錄來獲取此文件的路徑前綴。如果此環境變量不存在,則搜索結果爲實現定義的

和(記住,「文件」指的是execvp而非execv,所以environ變量適用於使用PATH「文件」參數搜索):

對於那些不包含envp指針的表單(execl(),execv()execlp(),和execvp()),爲新的處理圖像的環境,須與在呼叫過程中外部變量ENVIRON服用。

所以...你可以在技術上刪除整​​個PATH變量,但結果將是實現定義

+1

你不需要PATH。 – 2016-07-07 20:55:56

+0

通常,如果您使用'execvp *',那麼您沒有提供可執行文件的完整路徑名。 –

+0

您可能正在構建嵌入式設備,並且您的所有命令均由完整路徑指定。我也看到了嵌入式設備(我認爲Android是一個例子),沒有PATH變量就能正常工作。我假設shell使用它自己的默認路徑。但是,在一個通用的Unix系統中,沒有使用$ PATH(和$ HOME)的情況下運行並不是很有用。 –

1

最小值必要的環境是空的。你不需要需要什麼。

例如

$ env -i env 
$ 

我們可以看到env -i創建了一個空白的環境。

我們可以進一步採取這樣的:

$ env -i /bin/bash 
[email protected]:/home/sweh$ env 
LS_COLORS= 
PWD=/home/sweh 
SHLVL=1 
_=/usr/bin/env 

我們可以看到,bash設定了幾個變量,但沒有被繼承。

現在這樣的環境可能會破壞一些東西;例如缺少TERM變量意味着viless可能無法正常工作

$ less foo 
WARNING: terminal is not fully functional 
foo (press RETURN) 

所以,真的,你需要確定你希望的環境和自己的需求是什麼內運行什麼程序。