Bash 为什么sudo-H需要一个额外的命令?
我发现了这个相关的问题 这演示了-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
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的命令吗?