从https://stackoverflow.com/a/29400598/156458
到目前为止我在这里看到的其他解决方案基于一些系统定义,但实际上只需通过正确调用它就可以
sudo
使用当前环境PATH
(使用env
命令)和/或其余环境(使用选项)-E
:sudo -E env "PATH=$PATH" <command> [arguments]
事实上,我们可以用它来创建一个别名:
alias mysudo='sudo -E env "PATH=$PATH"'
(也可以命名别名本身
sudo
,替换原来的sudo
。)
鉴于
-E, --preserve-env 指示用户希望保留其现有环境变量的安全策略。如果用户没有保护环境的权限,安全策略可能会返回错误。
我想知道为什么以下不起作用
sudo -E <command> [arguments]
?
鉴于这"PATH=$PATH" <command> [arguments]
也是一个命令,我想知道为什么以下命令不起作用:
sudo "PATH=$PATH" <command> [arguments]
?
谢谢。
答案1
sudo -E <command> [arguments]
在你的情况下不起作用,因为 Debian 定义了secure_path
in ,它覆盖了Even with/etc/defaults
的值。PATH
-E
sudo "PATH=$PATH" <command> [arguments]
应该有效,因为PATH=$PATH
被 识别和处理sudo
。就我而言,sudo "PATH=$PATH" env
显示了我当前的PATH
价值。 (请注意,这PATH=$PATH <command>
不是普遍认可的命令;它对应于由 shell 和 识别的构造sudo
,但不一定在其他上下文中。)。
但是sudo
它本身并不使用它$PATH
来查找<command>
而是仍然使用secure_path
。
sudo -E env "PATH=$PATH" <command> [arguments]
之所以有效,是因为"PATH=$PATH"
将 的当前值存储PATH
在命令中,如sudo
和 then所示env
;替换其环境中给定的sudo
的值,但然后从其参数中读取该值以构建 的环境。PATH
env
env
<command>
在这里,命令由inenv
查找,但它本身在提供的 中查找。sudo
secure_path
env
<command>
$PATH