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中执行的一样