Linux shell sh bash . source exec的区别

shell sh bash 执行

使用sh执行时,系统会给予一个新的bash来让我们运行脚本,就相当于创建一个子进程来运行(子进程运行时候父进程sleep,子进程执行完回到父进程),子进程会继承父进程(也就是你当前进程)的环境变量,但是不继承父进程的自定义变量(环境变量和自定义变量我以后讲),当子进程执行完毕后,子进程bash内的素有的数据就会被删除.
需要注意的是sudo su也是创建新的bash,你得到的bash是你原进程的子进程的子进程的子进程,其中关于环境变量的继承就不是单纯的直接继承,中间控制可以参考/etc/sudoers的配置

example

创建setenv.sh文件

export ZZZ=“zzz”
export ZZX=“zzx”
echo $ZZZ $ZZX

在这里插入图片描述
可以看到执行脚本后,我们的主进程中并没有这两个变量存在

source 和 . 执行

使用source和.执行时,不会生成子进程,setenv.sh中的每一条都会在当前bash中执行,因此各项操作都会在当前bash中生效。(这也就是为什么你在不注销系统的情况下要让某些写入~/.bashrc的设置生效时,需要用source ~/.bashrc或者点执行 . ~/.bashrc,而不是用bash ~/.bashrc,因为只有前者才会在当前bash中生效)

example

在这里插入图片描述
. setenv.sh执行结果也是一样的

exec 执行

系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。

example

在这里插入图片描述
echo $$ 输出当前进程pid
echo ${PPID} 输出当前进程副进程pid
可以看到我在hello002进程中,进程pid为12345,父进程pid为7559,当我使用exec 执行ls命令后,我的进程跳了hello001进程, 进程pid为7559,刚刚是hello002进程的父进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值