先来说一下主要以下有几种方式:
fork 是最普通的, 就是直接在脚本里面用 path/to/foosh 来调用
foosh 这个脚本,比如如果是 foosh 在当前目录下,就是 /foosh 。运行的时候 terminal 会新开一个子 Shell 执行脚本 foosh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。
exec 与 fork 不同,不需要新开一个子 Shell 来执行被调用的脚本 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别
与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。
其实从命名上可以感知到其中的细微区别,下面通过两个脚本来体会三种调用方式的不同:
第一个脚本,我们命名为 1sh :
第二个脚本,我们命名为 2sh :
注:这两个脚本中的参数 $$ 用于返回脚本的 PID , 也就是进程 ID。这个例子是想通过显示 PID 判断两个脚本是分开执行还是同一进程里执行,也就是是否有新开子 Shell。当执行完脚本 2sh 后,脚本 1sh 后面的内容是否还执行。
chmod +x 1sh 2sh 给两个脚本加上可执行权限后执行情况:
fork 方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值(1sh PID=82266, 2sh PID=82267),可以看出,两个脚本是分成两个进程运行的。
exec 方式运行的结果是,2sh 执行完成后,不再回到 1sh。运行顺序为 1-2。从pid值看,两者是在同一进程 PID=82287 中运行的。
source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。
参考:
#!/bin/sh
#使用read命令读取用户输入的数字,赋值给变量pid
read -p "Input PID: " pid
#ps命令列出所有进程,awk打印第一行标题行及进程号为pid的进程详情,输出到文件output
ps aux | awk -v n=$pid 'NR==1||$2==n{print}' >output
awk命令中,NR为内部变量,表示Number of Record,行号。$2表示第二个字段(PID)。
以上就是关于在 Shell 脚本中调用另一个 Shell 脚本的三种方式全部的内容,包括:在 Shell 脚本中调用另一个 Shell 脚本的三种方式、编写一个shell脚本程序.功能是输入一个数字,给出系统中以该数字为pid的进程详情,并输出到一个文件里、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)