Shell:如何从另一个shell脚本中调用一个shell脚本?

1136
我有两个 Shell 脚本,a.shb.sh
如何在脚本 a.sh 中调用 b.sh

9
请问您需要的是哪个操作系统以及哪个Shell,还是仅仅是原理上的问题?提供一些示例代码将有助于解决问题。 - jsalonen
19
这不是一个具体的问题,也没有表现出先前解决问题的努力。 - Kris
2
我遇到的一个问题是 b.sh 没有可执行权限。检查一下可能是个好主意。 - seth10
2
在脚本名称前添加 ./,例如,使用 ./b.sh 而不是 b.sh - Benny
2
如果有人一直收到“没有这个文件或目录”错误,请参考以下链接:https://dev59.com/x3E85IYBdhLWcg3wJQCt#2920431 - Amr Lotfy
1
这个解决方案有什么问题吗?:像第一个脚本一样启动第二个脚本。我非常惊讶这个问题能够得到如此高的评分,因为问题中甚至没有呈现最简单的代码或错误信息。 - U. Windl
18个回答

11

这是对我有用的方法,这是执行其他脚本的主要sh脚本的内容。

#!/bin/bash 
source /path/to/other.sh

10

顶部的答案建议在调用子脚本的第一行添加#!/bin/bash。但即使添加了shebang,使用子shell运行脚本并捕获输出也会更快*:

$(source SCRIPT_NAME)

当您想要继续运行相同的解释器(例如从bash到另一个bash脚本)并确保不执行子脚本的shebang行时,可以使用此方法。

例如:

#!/bin/bash
SUB_SCRIPT=$(mktemp)
echo "#!/bin/bash" > $SUB_SCRIPT
echo 'echo $1' >> $SUB_SCRIPT
chmod +x $SUB_SCRIPT
if [[ $1 == "--source" ]]; then
  for X in $(seq 100); do
    MODE=$(source $SUB_SCRIPT "source on")
  done
else
  for X in $(seq 100); do
    MODE=$($SUB_SCRIPT "source off")
  done
fi
echo $MODE
rm $SUB_SCRIPT

输出:

~ ❯❯❯ time ./test.sh
source off
./test.sh  0.15s user 0.16s system 87% cpu 0.360 total

~ ❯❯❯ time ./test.sh --source
source on
./test.sh --source  0.05s user 0.06s system 95% cpu 0.114 total

* 例如当病毒或安全工具正在运行设备时,执行新进程可能需要额外100毫秒的时间。


5
pathToShell="/home/praveen/"   
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"

5
chmod a+x /path/to/file-to-be-executed

我需要的只是这个。一旦将要执行的脚本像这样变成可执行文件,你(至少在我的情况下)在调用脚本时不需要任何其他额外操作,如sh./

感谢@Nathan Lilienthal的评论。


5
 #!/bin/bash

 # Here you define the absolute path of your script

 scriptPath="/home/user/pathScript/"

 # Name of your script

 scriptName="myscript.sh"

 # Here you execute your script

 $scriptPath/$scriptName

 # Result of script execution

 result=$?

1
文件夹 scriptPath 或文件名 scriptName 中包含空格不正确。 - Andrei Krasutski

4
假设新文件为 "/home/satya/app/app_specific_env",文件内容如下:
#!bin/bash

export FAV_NUMBER="2211"

将此文件引用附加到 ~/.bashrc 文件中。
source /home/satya/app/app_specific_env

每当您重新启动机器或重新登录时,在终端中尝试echo $FAV_NUMBER。它将输出该值。
以防万一,如果您想立即看到效果,请在命令行中运行source ~/.bashrc

3

从其他文件导入函数可能会遇到一些问题。
首先:您不需要将此文件设置为可执行文件。最好不要这样做!只需添加即可。

. file

导入所有函数。它们都会像在你的文件中定义一样。
第二点:你可能会定义同名函数。这会被覆盖,不好。你可以这样声明

declare -f new_function_name=old_function_name 

只有在这之后才进行导入。因此,您可以通过新名称调用旧函数。
第三条:您只能导入文件中定义的完整函数列表。如果某些函数不需要,您可以取消它们。但是,如果您在取消设置后重写函数,则会丢失它们。但是,如果您像上面描述的那样设置对其的引用,则可以使用相同的名称在取消设置后恢复。
最后,通常的导入过程是危险且不太简单的。请小心!您可以编写脚本以更轻松、安全地执行此操作。如果您仅使用部分函数(而不是全部),最好将它们拆分为不同的文件。不幸的是,在Bash中,这种技术并不好用。例如,在Python和其他一些脚本语言中,这很容易且安全。可以使用自己的名称进行部分导入所需的函数。我们都希望在下一个Bash版本中将完成相同的功能。但现在,我们必须编写许多额外的代码来实现您想要的功能。


(欢迎来到SO!)由于用户[Praveen](https://stackoverflow.com/users/1049028/praveen)上次出现在2011年,因此很难弄清楚问题是如何使shell执行a.sh执行b.sh(如果没有命令,继续执行a.sh),还是字面上调用b.sh。(我的拼写检查器无法捕获“bush版本”。)(你有人可以求助英语语法吗?(有时候我也希望有。)) - greybeard

3

使用反引号。

$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`

然后将生产者脚本的输出作为参数传递给消费者脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接