这个问题https://superuser.com/questions/319043/runing-a-command-without-inheriting-parents-environment建议我们可以在不继承父环境的情况下运行命令
$ sudo -u "`whoami`" $COMMAND
有没有办法在不使用的情况下做到这一点sudo
?由于 whilesudo
非常流行,它还没有达到可移植状态(或在 POSIX 中)。
我已经尝试过env -i $COMMAND
,但效果不好,因为它删除了所有环境变量。我想要的是运行命令默认环境。
答案1
login(1)
传统上,在登录时设置一组有限的环境变量。即使用户以自己的身份登录, Likesu
login
通常也会要求输入密码,因此这里可能并不理想。 Unix 系统可能有额外的或不同的复杂性,例如,如果有 PAMpam_env(8)
可以添加或删除 .sets 所设置的环境变量login
。因此,所做内容的副本login(1)
可能会创建与通过 PAM 集实际登录不同的环境变量集。
然后是终端和外壳;终端可能会也可能不会将后续进程作为“登录”shell 启动。当标记为登录时,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
和new
文件以查看它们有何不同(可能涉及sort
和diff
命令),然后可能更新命令env
以设置在执行登录 shell 之前遗漏的内容。
另一个想法是环境快照并将其用作默认值。