为什么 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
和 $USER
在 sudo
甚至 运行 之前扩展了 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)需要在新用户的执行环境中进行变量扩展。
我找到了这个相关问题
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
和 $USER
在 sudo
甚至 运行 之前扩展了 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)需要在新用户的执行环境中进行变量扩展。