![如何像子程序一样调用其他 shell 脚本?](https://linux22.com/image/16667/%E5%A6%82%E4%BD%95%E5%83%8F%E5%AD%90%E7%A8%8B%E5%BA%8F%E4%B8%80%E6%A0%B7%E8%B0%83%E7%94%A8%E5%85%B6%E4%BB%96%20shell%20%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
如何调用其他 shell 脚本并等待其完成?
我想传递输入参数并接收返回的结果代码。并继续运行其余代码。
答案1
你没有说你正在使用哪个 shell,所以假设 bash,你只需这样做
#!/bin/bash
/path/to/other/script arg1 arg2
rc=$?
变量 rc 现在包含其他脚本的返回代码。根据您想要实现的目标,您可能会尝试做更多的事情,但您的问题非常模糊,这是最好的起点。
答案2
根据您想要执行的操作,主要有两种可能性:
您可以像调用任何其他程序一样调用其他脚本。
/path/to/other/script foo bar echo "The script exited with status $?"
您可以“获取”其他脚本,即让正在运行的 shell 读取它并执行其内容。这样,被调用的脚本(变量分配、当前目录更改等)就会修改其调用者的环境。调用另一个脚本的内置函数
.
(只是一个点);有些贝壳有source
另一个名称.
。您不能以这种方式传递参数(嗯,您可以在某些 shell 中但不是全部);但被调用的脚本可以访问调用者的所有变量。. /path/to/other/script
无论哪种方式,如果您省略其他脚本的路径,它将在$PATH
.有些 shell 也会自动查找当前目录,但其他 shell 不会(标准行为不是)。
答案3
还有另一种方法可以做到这一点。
如果您使用真正的 Korn Shell(不确定 pdksh),您可以动态加载函数。
在 PATH 中的某处创建名为“main”的文件:
#!/bin/ksh
echo "Main ksh script"
echo "Calling georgi, probably in another file"
georgi $1 $2 $3
echo "Back from georgi"
franco $1 $2 $3
在其他地方创建名为“georgi”的文件,例如/tmp
:
function georgi {
echo "Enter function georgi $1 $2 $3"
}
function franco {
echo "Enter function franco $1 $2 $3"
}
使文件 main 可执行。制作文件“georgi”不是可执行的。导出名为 FPATH 的变量:
export FPATH=/tmp
运行文件“main”:
% ./main aaa bbb c123
Main ksh script
Calling georgi, probably in another file
Enter function georgi aaa bbb c123
Back from georgi
Enter function franco aaa bbb c123
这有点晦涩,你必须让事情完全正确,比如将自动加载的文件命名为你调用的第一个函数,并且如果自动加载的文件位于 PATH 和 FPATH 中,则不要将其标记为可执行文件。