Shell

使用“預設”環境執行命令

  • September 7, 2018

這個問題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'

然後比較defandnew文件以查看它們有何不同(可能涉及sortanddiff命令),然後可能更新env命令以設置在執行登錄 shell 之前失去的內容。

另一個想法是對環境進行快照並將其用作預設值。

引用自:https://unix.stackexchange.com/questions/467573