【类unix系统shell基础】1.08shell与进程
2016-01-11 15:43
337 查看
大部分资料参考于《shell十三问》,链接:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=218853&page=4#pid1511745
当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及(更重要的是)继承父进程的环境,也就是环境变量,但是环境变量只能从父行程到子行程单向继承。换句话说:在子行程中的环境如何变更,均不会影响父行程的环境。
因此,在系统中,当我们用fork方式执行一个shell脚本时,其实是先产生一个sub-shell的子行程,然后sub-shell再去产生命令行的子行程。
fork方式:
由于所有执行结果均于当前shell内完成,若脚本的环境有所改变,当然也会改变当前环境了!
source方式:
exec 方式:
exec ./shell.sh
2.sh
然后,分别跑如下参数来观察结果:
CODE:
1. fork
在类unix系统中,我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去。此一现象被称为fork。当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及(更重要的是)继承父进程的环境,也就是环境变量,但是环境变量只能从父行程到子行程单向继承。换句话说:在子行程中的环境如何变更,均不会影响父行程的环境。
因此,在系统中,当我们用fork方式执行一个shell脚本时,其实是先产生一个sub-shell的子行程,然后sub-shell再去产生命令行的子行程。
fork方式:
(1) ./shell.sh
(2) bash shell.sh
2. source
谓source就是让脚本在当前shell内执行而不是产生一个sub-shell来执行。由于所有执行结果均于当前shell内完成,若脚本的环境有所改变,当然也会改变当前环境了!
source方式:
(1) source ./shell.sh
(2) . ./shell.sh
3. exec
exec也是让脚本在同一个进程上执行,但是原有进程则被结束了。简而言之:原有进程会否终止,就是exec与source/fork 的最大差异了。也就是说,原进程在exec一个新的进程之后,新的进程会代替旧的继续执行,原进程后面的语句将不被执行。exec 方式:
exec ./shell.sh
4.验证脚本
1.sh#!/bin/bash A=B echo "PID for 1.sh before exec/source/fork:$$" export A echo "1.sh: \$A is $A" case $1 in exec) echo "using exec..." exec ./2.sh ;; source) echo "using source..." . ./2.sh ;; *) echo "using fork by default..." ./2.sh ;; esac echo "PID for 1.sh after exec/source/fork:$$" echo "1.sh: \$A is $A"
2.sh
#!/bin/bash echo "PID for 2.sh: $$" echo "2.sh get \$A=$A from 1.sh" A=C export A echo "2.sh: \$A is $A"
然后,分别跑如下参数来观察结果:
CODE:
$ ./1.sh fork $ ./1.sh source $ ./1.sh exec
相关文章推荐
- shell 脚本知识点
- 【类unix系统shell基础】1.07 变量
- 【类unix系统shell基础】1.06单引号和双引号
- 【类unix系统shell基础】1.05命令行基本组成元素
- 【类unix系统shell基础】1.04文件的链接
- 【类unix系统shell基础】1.03文件的安全与特殊权限
- 【类unix系统shell基础】1.02更改文件权限
- linux之shell脚本学习篇一
- shell的常用特殊符号
- Android_shell编程
- Shell Python 日期和时间戳的互相转换
- Shell标准输出、标准错误 >/dev/null 2>&1
- linux shell
- Linux shell 学习
- hbase shell入门
- shell脚本报错---ge: unary operator expected
- shell 中的特殊符号的含义
- shell中$的用法
- shell修改文件名
- shell技巧