如何像子程序一样调用其他 shell 脚本?

如何像子程序一样调用其他 shell 脚本?

如何调用其他 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 中,则不要将其标记为可执行文件。

相关内容