我发现了这个相关的问题What does sudo -H do?
演示了 但我不明白为什么 将显示当前用户变量(而不是root用户)。 那么为什么(在这种情况下)bash所需的bash作为sudo参数运行以获取-H标志? 如果指定其他用户,例如sudo -H bash -c 'echo $HOME $USER'
bash
是必要的,因为echo命令可以独立运行,但是运行sudo -H echo $HOME $USER
sudo -H -u anotheruser echo $HOME $USER
。
答案 0 :(得分:1)
$HOME
甚至运行之前, $USER
和sudo
由shell进行扩展。您需要bash -c
添加一个间接层,以便 sudo
运行的shell进行扩展。
答案 1 :(得分:1)
运行命令时:
sudo -H echo $HOME $USER
变量$HOME
和$USER
由当前shell评估。它们将替换为它们的值,并且以这种方式调整的命令行将传递给sudo
。
F.e。如果您的用户名为foo
且您的住所为/home/foo
,则上述命令与以下命令相同:
sudo -H echo /home/foo foo
获得您想要的东西不一定是bash
。它需要一种方法来通过sudo
执行的命令来评估环境变量,而不是当前的shell。
当你跑步时:
sudo -H bash -c 'echo $HOME $USER'
当前shell不评估$HOME
和$USER
环境变量,因为它们用单引号括起来。
sudo
接收在此处写入的命令行(它的第四个参数是字符串echo $HOME $USER
作为单个单词)。然后它使用两个参数bash
和上面提到的字符串启动-c
。
bash
将-c
解释为"执行命令"这是作为下一个参数提供的。然后它尝试运行echo $HOME $USER
(注意这里的变量没有用引号括起来),并且在运行echo
之前,它用它们的值替换$HOME
和$USER
(属于现在给新用户。)
在新用户的执行环境中执行变量扩展需要运行bash
(或任何其他shell)。