为什么命令可以
sudo
从父shell进程继承环境来运行,而sudo su
root用户之后的shell进程却不能?t@ocean:/tmp$ export ME=tim t@ocean:/tmp$ sudo echo $ME tim t@ocean:/tmp$ sudo su root@ocean:/tmp# echo $ME root@ocean:/tmp# exit
环境是从父进程继承到子进程的吗?
sudo su
root用户之后的shell进程是前一个用户的shell进程的子进程吗?
谢谢。
答案1
环境变量扩展是由 shell 完成的,因此您实际运行的命令是“sudo echo tim”。这一切都是在 sudo 运行之前完成的。
答案2
变量扩展由交互式 shell 执行。您正在运行
sudo
带有参数echo
和 的命令tim
。如果您希望在由 调用的 shell 中进行扩展sudo
,请告诉它运行 shell 并将字符串传递echo $ME
给该 shell:sudo sh -c 'echo $ME'
sudo
从环境中删除大多数变量,因为它们在某些情况下可能会带来安全风险。有关详细信息,请参阅手册和机器的配置。使用典型的配置,变量ME
将从环境中删除,因此sudo sh -c 'echo $ME'
不会打印任何内容。进程的环境是其父进程的副本,除非父进程决定更改它。 (更准确地说,环境被传递给
execve
;大多数程序只是通过它们所拥有的一切。)Sudo 是决定改变环境的程序之一。如果您运行
sudo su
,则会运行 shell(因为您没有将命令传递给su
)。该 shell 进程的父进程是调用的进程sudo
,即运行命令的 shellsudo su
。