作者:忧伤的嫖客 | 来源:互联网 | 2023-09-10 16:52
在Shell脚本中调用另一个脚本的三种方式讲解是千自学中一篇关于shell的文章简介:先来说一下主要以下有几种方式:fork:如果脚本有执行权限的话,pathtofoo.sh。如果没有,shpathtofoo.sh。exec:execpathtofoo.shsource:sourcepathtofoo.shforkf
先来说一下主要以下有几种方式:
fork:如果脚本有执行权限的话,path/to/foo.sh。如果没有,shpath/to/foo.sh。
exec:execpath/to/foo.sh
source:sourcepath/to/foo.sh
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/envbash
A=1
echo"beforeexec/source/fork:PIDfor1.sh=$$"
exportA
echo"In1.sh:variableA=$A"
case$1in
--exec)
echo-e"==usingexec…\n"
exec./2.sh;;
--source)
echo-e"==usingsource…\n"
../2.sh;;
*)
echo-e"==usingforkbydefault…\n"
./2.sh;;
esac
echo"afterexec/source/fork:PIDfor1.sh=$$"
echo-e"In1.sh:variableA=$A\n"
第二个脚本,我们命名为2.sh:
#!/usr/bin/envbash
echo"PIDfor2.sh=$$"
echo"In2.shgetvariableA=$Afrom1.sh"
A=2
exportA
echo-e"In2.sh:variableA=$A\n"
注:这两个脚本中的参数$$用于返回脚本的PID,也就是进程ID。这个例子是想通过显示PID判断两个脚本是分开执行还是同一进程里执行,也就是是否有新开子Shell。当执行完脚本2.sh后,脚本1.sh后面的内容是否还执行。
chmod+x1.sh2.sh给两个脚本加上可执行权限后执行情况:
fork
fork方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值(1.shPID=82266,2.shPID=82267),可以看出,两个脚本是分成两个进程运行的。
exec
exec方式运行的结果是,2.sh执行完成后,不再回到1.sh。运行顺序为1-2。从pid值看,两者是在同一进程PID=82287中运行的。
source
source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对#的支持。如果你想了解更多相关内容请查看下面相关链接
您可能感兴趣的文章:Shell中exit和return的区别讲解使用shell脚本来给mysql加索引的方法干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)linuxshell之通过标识测试文件系统属性的方法示例linuxshell中if的各种判断linuxshell之pushd、popd和dirs的使用讲解linuxshell之控制台打印各种颜色字体和背景的实现方法shell脚本实现监控某个进程意外停止后拉起进程使用shell脚本每天对MySQL多个数据库自动备份的讲解使用shell来发tcp包的方法