我正在寫一個shell。什麼是最低要求的環境變量?
通過系統調用execvpe
,我可以運行程序並控制其環境。我需要在這裏通過什麼最小值?
另外,我明白,子進程應該有一個父母的環境的副本,可能與一些值添加。在測試我的shell時,我從終端內部的窗口管理器等內的bash內運行它。我可以假設的基礎是什麼?如果我直接從TTY(「最低級別」,據我瞭解)運行我的shell,我可以期待什麼?
我正在寫一個shell。什麼是最低要求的環境變量?
通過系統調用execvpe
,我可以運行程序並控制其環境。我需要在這裏通過什麼最小值?
另外,我明白,子進程應該有一個父母的環境的副本,可能與一些值添加。在測試我的shell時,我從終端內部的窗口管理器等內的bash內運行它。我可以假設的基礎是什麼?如果我直接從TTY(「最低級別」,據我瞭解)運行我的shell,我可以期待什麼?
這是一個非常廣泛的問題。在一定程度上, 程序應該能夠在沒有環境的情況下運行。
DISPLAY
環境變量 提供此信息,但也可以在命令行上傳遞此信息。 可能有其他環境變量對於「X」程序來說至關重要的 (或幾乎如此);我已經看過那個引擎蓋,已經有一段時間了。TERM
環境變量。 「特殊特性」是指能夠設置顏色 (如ls
和grep
可以做,受期權), 移動屏幕(如vi
/vim
)左右, ,甚至不知道屏幕的尺寸(如less
) 。 請注意,屏幕的大小也可以從 到ROWS
和COLUMNS
。TZ
)用戶理解 - 雖然,如果你願意與絕對工作(GMT/UTC) , 你不需要這個。等
,你需要的是一個工作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
變量,但結果將是實現定義。
最小值必要的環境是空的。你不需要需要什麼。
例如
$ 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
變量意味着vi
或less
可能無法正常工作
$ less foo
WARNING: terminal is not fully functional
foo (press RETURN)
所以,真的,你需要確定你希望的環境和自己的需求是什麼內運行什麼程序。
你不需要PATH。 – 2016-07-07 20:55:56
通常,如果您使用'execvp *',那麼您沒有提供可執行文件的完整路徑名。 –
您可能正在構建嵌入式設備,並且您的所有命令均由完整路徑指定。我也看到了嵌入式設備(我認爲Android是一個例子),沒有PATH變量就能正常工作。我假設shell使用它自己的默認路徑。但是,在一個通用的Unix系統中,沒有使用$ PATH(和$ HOME)的情況下運行並不是很有用。 –