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

Bash 为什么sudo-H需要一个额外的命令?,bash,sudo,Bash,Sudo,我发现了这个相关的问题 这演示了-H与的用法 sudo-hbash-c'echo$HOME$USER' 但是我不明白为什么有必要使用bash,因为echo命令可以独立运行 sudo-H echo$HOME$USER 将显示当前用户变量(而不是根变量) 那么(在本例中)为什么作为sudo参数运行的命令需要bash来接受-H标志呢 如果一个用户指定了另一个用户,例如sudo-H-u另一个用户echo$HOME$user$HOME和$user在sudo甚至运行之前由shell展开,则也是如此。您需要b

我发现了这个相关的问题 这演示了-H与的用法

sudo-hbash-c'echo$HOME$USER'

但是我不明白为什么有必要使用
bash
,因为echo命令可以独立运行

sudo-H echo$HOME$USER

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

那么(在本例中)为什么作为sudo参数运行的命令需要bash来接受-H标志呢


如果一个用户指定了另一个用户,例如
sudo-H-u另一个用户echo$HOME$user
$HOME
$user
sudo
甚至运行之前由shell展开,则也是如此。您需要
bash-c
添加一层间接寻址,以便
sudo
运行的shell进行扩展。

运行命令时:

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)需要在新用户的执行环境中进行变量扩展。

sudo-H echo$HOME$user
前面放置一个
echo
,您就会明白。这里需要的不是
bash
,而是通过
sudo
启动的命令来计算
$HOME
,而不是通过当前的shell。那么这种计算是什么类型的命令呢?显然echo不能做到这一点,它必须是能够创建交互式shell的命令吗?