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

在 Shell 脚本中调用另一个 Shell 脚本的三种方式,第1张

先来说一下主要以下有几种方式

fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用

foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh 。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。

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

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

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

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

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

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

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

fork 方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值(1.sh PID=82266, 2.sh PID=82267),可以看出,两个脚本是分成两个进程运行的。

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

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

参考竖旅蚂:

编写好的shell脚本(如:test),返伏可以采取两种方式进行运行:\x0d\x0a一、 $ sh test\x0d\x0a一般不采用这种调用方式,尤其不采用“sh<test”的调用方式,因为这种方式将禁止shell读取标准输入。\x0d\x0a也可以采用 $ ksh test\x0d\x0a这种方式要求shell具有“可读”的访问权限。\x0d\x0a二、直接运行可执行的shell脚本之前,首先应使用下列chmod命令,把shell脚本文件设置为可执行的文件。\x0d\x0achmod 755 test(除文件属主可写之外,每个用户均具有读和可执行的访问权限)\x0d\x0achmod +rx test(同上)\x0d\x0achmod u+rx test(只有文件属主具有读和执行的访问权限)\x0d\x0a按照上述要求哗穗设置shell脚本文件的访问权限后,可采用下列方式,直接运行shell脚乱世卜本了。\x0d\x0a1、test(如果命令检索路径包含当前目录)\x0d\x0a2、./test(如果命令减缩路径不包含当前目录)\x0d\x0a*说明: sh test 方式调用一个shell叫蹦可能会禁止某些shell特定的扩展功能,因而可能引起脚本无法正确执行。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/8169461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存