最新消息:最新信息可以到系统基本设置里填写,如果不想要这一栏可以修改head.htm,将第53行到55行删除即可

在Shell脚本中调用另一个脚本的三种方式讲解

创意新鲜 dedesos.com

fork

fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 shell 执行脚本 foo.sh,子 shell 执行的时候, 父 shell 还在。子 shell 执行完毕后返回父 shell。 子 shell 从父 shell 继承环境变量,但是子 shell 中的环境变量不会带回父 shell。

exec

exec 与 fork 不同,不需要新开一个子 shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别.

source

与 fork 的区别是不新开一个子 shell 来执行被调用的脚本,而是在同一个 shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。

其实从命名上可以感知到其中的细微区别,下面通过两个脚本来体会三种调用方式的不同:

第一个脚本,我们命名为 1.sh:

#!/usr/bin/env bash
echo "before exec/source/fork: pid for 1.sh = $$"
export a
echo "in 1.sh: variable a=$a"
case $1 in
 --exec)
 echo -e "== using exec…
"
 exec ./2.sh ;;
 --source)
 echo -e "== using source…
"
 . ./2.sh ;;
 echo -e "== using fork by default…
"
 ./2.sh ;;
echo "after exec/source/fork: pid for 1.sh = $$"
echo -e "in 1.sh: variable a=$a
"

第二个脚本,我们命名为 2.sh:

#!/usr/bin/env bash
echo "pid for 2.sh = $$"
echo "in 2.sh get variable a=$a from 1.sh"
export a
echo -e "in 2.sh: variable a=$a
"

注:这两个脚本中的参数 $$ 用于返回脚本的 pid , 也就是进程 id。这个例子是想通过显示 pid 判断两个脚本是分开执行还是同一进程里执行,也就是是否有新开子 shell。当执行完脚本 2.sh 后,脚本 1.sh 后面的内容是否还执行。

chmod +x 1.sh 2.sh 给两个脚本加上可执行权限后执行情况:

fork

fork 方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的pid值,可以看出,两个脚本是分成两个进程运行的。

exec

exec 方式运行的结果是,2.sh 执行完成后,不再回到 1.sh。运行顺序为 1-2。从pid值看,两者是在同一进程 pid=82287 中运行的。

source

source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。

总结


    与本文相关的文章

    网友最新评论