为什么 sudo -H 需要一个额外的命令?

Why sudo -H needs an extra command?

我找到了这个相关问题 演示了 -H with

的用法

sudo -H bash -c 'echo $HOME $USER'

但我不明白为什么bash是必要的,因为echo命令可以独立存在,但是运行

sudo -H echo $HOME $USER

将显示当前用户变量(而不是 root 变量)。

那么为什么(在这种情况下)命令 运行 需要 bash 作为 sudo 参数来接收 -H 标志?

如果一个人指定另一个用户也是如此,例如sudo -H -u anotheruser echo $HOME $USER

$HOME$USERsudo 甚至 运行 之前扩展了 shell。您需要 bash -c 添加一个间接层,以便 shell 运行 by sudo 进行扩展。

当您 运行 命令时:

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'

$HOME$USER 环境变量未被当前 shell 评估,因为它们被单引号括起来。

sudo 接收这里写的命令行(它的第四个参数是字符串 echo $HOME $USER 作为一个单词)。然后它使用两个参数启动 bash-c 和上面提到的字符串。

bash-c 解释为作为下一个参数提供的 "execute a command"。然后它尝试 运行 echo $HOME $USER(注意这里变量没有用引号引起来)并且在 运行ning echo 之前它替换 $HOME$USER 及其值(现在属于新用户)。

运行 bash(或任何其他 shell)需要在新用户的执行环境中进行变量扩展。