ruby和shell之间不同的sudo环境变量

ruby和shell之间不同的sudo环境变量,ruby,linux,shell,Ruby,Linux,Shell,我正在写一个需要与sudo一起运行的脚本,遇到了一些奇怪的事情,想知道是否有人可以解释它 我的环境变量在ruby和shell中的行为似乎不一样: user@server:~$ sudo echo $HOME /home/user user@server:~$ sudo /opt/ruby-2.1.2-p95/bin/irb irb(main):002:0> puts ENV['HOME'] /root => nil irb(main):003:0> 这可能是什么原因 编辑:

我正在写一个需要与sudo一起运行的脚本,遇到了一些奇怪的事情,想知道是否有人可以解释它

我的环境变量在ruby和shell中的行为似乎不一样:

user@server:~$ sudo echo $HOME
/home/user

user@server:~$ sudo /opt/ruby-2.1.2-p95/bin/irb
irb(main):002:0> puts ENV['HOME']
/root
=> nil
irb(main):003:0>
这可能是什么原因


编辑:澄清一下-我不是问为什么sudo会重置我的env变量,我是问为什么当我运行shell命令/脚本(第一个命令)时它不会重置,但当我从同一shell会话运行ruby(第二个命令)时它会重置,而配置没有任何更改。

默认情况下,sudo会重置环境变量。您可以使用sudo的
--preserve env
(简称
-E
)来保护环境。您可以运行
man sudo
以了解有关sudo及其选项的更多信息。

sudo
重置环境变量。
sudo
以root用户身份执行命令,
/root
是root的主目录。为什么不希望更新
$HOME
?您可以尝试使用
--preserve env
选项,但这取决于
sudoers
中启用的权限。在第一个命令中,
$HOME
将在普通shell中展开,不是由sudo运行的shell运行的。试试:
sudobash-c'echo$HOME'
,你会看到区别。