使用“預設”環境執行命令
這個問題https://superuser.com/questions/319043/runing-a-command-without-inheriting-parents-environment表明我們可以在不繼承父環境的情況下執行命令
$ sudo -u "`whoami`" $COMMAND
有沒有不使用的方法
sudo
?由於 whilesudo
非常流行,它還沒有達到可移植狀態(或在 POSIX 中)。我試過
env -i $COMMAND
了,但它不好,因為它刪除了所有的環境變數。我想要的是在預設環境中執行命令。
login(1)
傳統上在登錄時設置一組有限的環境變數。su
login
即使一個人以自己的身份登錄,Like通常也會要求輸入密碼,因此這裡可能並不理想。Unix 系統可能有額外的或不同的複雜性,例如,如果有 PAMpam_env(8)
可以從login
. 因此,所做操作的副本login(1)
可能會創建與通過 PAM 集實際登錄不同的環境變數集。然後是終端和外殼;終端可能會也可能不會將後續程序作為“登錄”外殼啟動。當標記為登錄時,Shell 可能會讀取不同的文件,並且最終可能會為登錄與非登錄實例提供不同的環境變數。有關於這個主題的現有文獻。
因此,根據 unix、登錄過程、本地系統配置、使用者使用的 shell 以及該 shell 的本地配置,可能會“預設”設置不同的環境變數。
您可以使用登錄 shell 實例獲得合適的環境變數列表:
% export CANARY=tweet % env -i bash -l -c 'env | grep CANARY' /Users/jhqdoe/.profile: line 6: set: markdirs: invalid option name %
這確實從父程序中清除了環境變數(
env | grep CANARY
將是你要去的地方$COMMAND
)。.profile
這裡實際上是為了mksh
,不是bash
。但是,上面可能沒有設置登錄工作流設置的必要變數,因為它沒有通過該程式碼。這些可能會被檢查以查看它們在新登錄時的情況,然後執行:$ env > def $ env -i bash -l -c 'env > new'
然後比較
def
andnew
文件以查看它們有何不同(可能涉及sort
anddiff
命令),然後可能更新env
命令以設置在執行登錄 shell 之前失去的內容。另一個想法是對環境進行快照並將其用作預設值。