全部博文(298)
分类: Python/Ruby
2012-03-26 17:01:32
shell中的exec,source和fork
改编于:
(1)fork:我们在交互式的shell终端输入cd /proc/net可以跳转到该目录,但是讲该指令放于脚本内实现的时候变不能实现目录切换的功能,要了解这个的原因先要知道一下linux系统fork子进程,当子进程被产生的时候会继承父进程的环境变量和一些资源分配,但是父子进程的环境变量是相互独立的,子进程的环境变量的改变不能够使父进程的环境变量也改变,为啥将cd /proc/net写进脚本的时候不能使得目录切换呢,就是因为执行脚本的时候交互shell会产生一个新的子shell来执行脚本,两者是父子进程的关系,所以子进程的工作目录的改变不会引起父进程工作目录的改变。
(2)source:让脚本在当前shell内执行,而不是产生一个新的子shell来执行,如果我们要在脚本里面切换目录,那么我们可以使用source ./my.script ,比方说原来我们如此执行脚本:
1. ./my.script
现在改成这样:(‘.’等同于source)
1. source ./my.script
2. 或:
3. . ./my.script
(3)exec:也是让脚本在同一进程上执行,但是原来的进程被结束了。
我们可以通过下面的实例来了解这三个的不同:
1.sh
1. #!/bin/bash
2. A=B
3. echo "PID for 1.sh before exec/source/fork:$$"
4. export A
5. echo "1.sh: \$A is $A"
6. case $1 in
7. exec)
8. echo "using exec..."
9. exec ./2.sh ;;
10. source)
11. echo "using source..."
12. . ./2.sh ;;
13. *)
14. echo "using fork by default..."
15. ./2.sh ;;
16.esac
17.echo "PID for 1.sh after exec/source/fork:$$"
18.echo "1.sh: \$A is $A"
2.sh
1. #!/bin/bash
2. echo "PID for 2.sh: $$"
3. echo "2.sh get \$A=$A from 1.sh"
4. A=C
5. export A
6. echo "2.sh: \$A is $A"
然後,分別跑如下參數來觀察結果:
1. $ ./1.sh fork #创建新进程,执行了子进程后返回到父进程
2. $ ./1.sh source #未创建进程,执行完了2.sh另外一个脚本后返回
3. $ ./1.sh exec #未创建进程,执行完了2.sh结束进程,不再返回