子进程继承父进程的环境变量
父进程创建子进程,子进程继承父进程的环境变量,而不继承父进程的自定义变量(环境变量和自定义变量有什么区别我在《linux里面的环境变量和自定义变量》: link.里讲到过)
另外需要强调的一点,当我们登录linux并且取得一个进程bash后,我这个bash就是一个独立的进程,然后我在这个bash中执行的所有的命令都是由这个bash所衍生出来的,且哪些执行的命令都是子进程
可以看到我当前的pid是105287 我执行了两条命令,ps -ef 和 grep 105287,然后你会发现这两条命令都是新创建的一个进程来执行的,并且父进程就是当前进程.
下面让我们来看看子进程继承父进程环境变量,不继承自定义变量的案例
- echo $$ 当前bash pid为105287
- set| grep ZZZ 使用set可以查找所有的变量,包括环境变量和自定义变量,这里使用set| grep ZZZ是对查找进行过滤,发现没有与ZZZ相关的环境变量和自定义变量
- export ZZZ1=helloworld1 声明ZZZ1为环境变量并赋值helloworld1
- ZZZ2=helloworld2 定义ZZZ2为自定义变量赋值helloworld2
- set| grep ZZZ 通过set查找所有变量,发现存在ZZZ1和ZZZ2
- env| grep ZZZ 通过env查找环境变量,发现环境变量中只有ZZZ1
- bash 开启新的子进程
- echo $$ 当前子进程pid为107580
- ps -ef | grep 107580 查看进程关系,发现pid107580是pid105287的子进程,而105287就是我们刚刚的进程号,下一步开始检查继承了哪些变量
- set | grep ZZZ 使用set查找所有变量,发现只有ZZZ1
- env| grep ZZZ 使用env查找所有变量,发现只有ZZZ1,说明只有环境变量被继承了
sudo su为什么没有继承某些环境变量呢
主要因为执行sudo su后你得到的bash并不是之前bash的子进程,而是他的子进程的子进程的子进程,差不多就是重孙的意思吧(我不确定重孙是不是就是孙子的儿子的意思)
我的bash的pid是105287,我执行sudo su后,得到的进程pid是108632.
查询进程pid关系后得到108632是105287的重孙进程.
sudo su命令是切换root用户的命令,从当前bash105287切换到重孙bash105287中间经历了很多过程,你会发现有的环境变量被继承了,有的又没有继承,这都是受/etc/sudoers文件中配置影响(Defaults env_reset和Defaults env_keep之类的,我下会在以后的blogs中讲到)。