Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2414639
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: Python/Ruby

2012-03-26 17:01:32

shell中的execsourcefork

 

改编于:

 

1fork:我们在交互式的shell终端输入cd /proc/net可以跳转到该目录,但是讲该指令放于脚本内实现的时候变不能实现目录切换的功能,要了解这个的原因先要知道一下linux系统fork子进程,当子进程被产生的时候会继承父进程的环境变量和一些资源分配,但是父子进程的环境变量是相互独立的,子进程的环境变量的改变不能够使父进程的环境变量也改变,为啥将cd /proc/net写进脚本的时候不能使得目录切换呢,就是因为执行脚本的时候交互shell会产生一个新的子shell来执行脚本,两者是父子进程的关系,所以子进程的工作目录的改变不会引起父进程工作目录的改变。

2source:让脚本在当前shell内执行,而不是产生一个新的子shell来执行,如果我们要在脚本里面切换目录,那么我们可以使用source ./my.script ,比方说原来我们如此执行脚本:

1.   ./my.script

现在改成这样:(‘.’等同于source)

1.   source ./my.script

2.   或:

3.   . ./my.script

3exec:也是让脚本在同一进程上执行,但是原来的进程被结束了。

我们可以通过下面的实例来了解这三个的不同:

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结束进程,不再返回

 

 

阅读(1119) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~