笔记-shell的三种执行模式

linux发行版(lsb_release -a)
LSB Version: n/a
Distributor ID: ManjaroLinux
Description: Manjaro Linux
Release: 17.1.7
Codename: Hakoila
测试
test.sh文件

#!/bin/bash
kid_local=kid_local
export kid_env=kid_env
echo $parent_env
echo $parent_local

在用不同的方式调用脚本时先设置父shell的本地变量和环境变量,键入:
export parent_env=parent_env
parent_local = parent_local
在每个执行模式测试完后先unset掉在子shell里设置的环境变量和本地变量,防止测试不准

fork型

执行方式:
直接bash后面接脚本或者./接脚本
说是fork型是因为和fork函数差不多,在执行脚本时克隆出一个与父shell相同的内存空间(.text .rodate .data等段和页表相同),利用写时复制机制来节省内存
测试结果 :
执行test.sh脚本后输出:
parent_env
脚本返回后键入 : echo $kid_local 和 echo $kid_env 输出:

返回父shell后的pstree
键入 : pstree | grep bash 输出:
|-xfce4-terminal-±bash—su—bash-±grep
注:我用了xfce4上的终端,所以是xfce4-terminal,然后又切换到了root,所以有bash—su—bash
综上 :
父shell能访问到的本地变量不会被带到子shell中,父shell能访问到的环境变量会被带到子shell中,子shell的变量都不能带回父shell中

exec型

执行方式:
直接exec后面接脚本(注意不带.sh后缀)
测试
这个不好测试,不过exec和fork型的差不多,它会继承父shell的环境变量(本地变量不会继承),但是不会返回父shell中

source型

先键入 : unset kid_local 和 unset kid_env
执行方式:
直接source后面接脚本或者.后面接脚本
测试结果 :
执行test.sh脚本后输出:
parent_env
parent_local
脚本返回后键入 : echo $kid_local 输出:
kid_local
脚本返回后键入 : echo $kid_env 输出:
kid_env
返回父shell后的pstree
键入 : pstree | grep bash 输出:
|-xfce4-terminal-±bash—su—bash-±grep
综上 :
父shell中的变量都能带到子shell中,子shell中的变量都能带回父shell
就好像子shell中的脚本命令是直接在父shell中执行的一样

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值