Shell:如何从另一个外壳脚本调用一个外壳脚本?

我有两个shell脚本,a.shb.sh

如何从外壳脚本a.sh中调用b.sh

1418231 次浏览

有几种不同的方法可以做到这一点:

  1. 使另一个脚本可执行chmod a+x /path/to/fileNathan Lilienthal,在顶部添加#!/bin/bash行(称为sheband),以及文件到$PATH环境变量的路径。然后您可以将其作为普通命令调用;

  2. 或者用#0命令调用它(这是.的别名),如下所示:

    source /path/to/script
  3. 或者使用#0命令来执行它,比如:

    /bin/bash /path/to/script

第一种和第三种方法将脚本作为另一个进程执行,因此无法访问另一个脚本中的变量和函数。
第二种方法在第一个脚本的进程中执行脚本,并从另一个脚本中提取变量和函数(因此它们可以从调用脚本中使用)。

在第二种方法中,如果您在第二个脚本中使用exit,它也会退出第一个脚本。这在第一种和第三种方法中不会发生。

看看这个。

#!/bin/bashecho "This script is about to run another script."sh ./script.shecho "This script has just run another script."
pathToShell="/home/praveen/"chmod a+x $pathToShell"myShell.sh"sh $pathToShell"myShell.sh"

您可以使用/bin/sh调用或执行另一个脚本(通过您的实际脚本):

 # cat showdate.sh#!/bin/bashecho "Date is: `date`"
# cat mainscript.sh#!/bin/bashecho "You are login as: `whoami`"echo "`/bin/sh ./showdate.sh`" # exact path for the script file

产出将是:

 # ./mainscript.shYou are login as: rootDate is: Thu Oct 17 02:56:36 EDT 2013

假设新文件是“/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

首先,您必须包含您调用的文件:

#!/bin/bash. includes/included_file.sh

然后你像这样调用你的函数:

#!/bin/bashmy_called_function

我一直在寻找的答案:

( exec "path/to/script" )

如前所述,exec在不创建新进程的情况下替换shell。然而,我们可以将其放在子shell中,这是使用paranthees完成的。

编辑:( "path/to/script" )就够了

只需添加一行您在终端中键入的任何内容即可执行脚本!
例如:

#!bin/bash./myscript.sh &

如果要执行的脚本不在同一个目录中,只需使用脚本的完整路径即可。
例如:'/home/user/script-目录/./myscript.sh&

取决于。简短地…如果您想在当前控制台上加载变量并执行,您可以在代码上使用source myshellfile.sh。示例:

#!/bin/bashset -xecho "This is an example of run another INTO this session."source my_lib_of_variables_and_functions.shecho "The function internal_function() is defined into my lib."returned_value=internal_function()echo $this_is_an_internal_variable
set +x

如果您只想执行一个文件,而唯一让您感兴趣的是结果,您可以这样做:

#!/bin/bashset -x./executing_only.shbash i_can_execute_this_way_too.shbash or_this_way.shset +x
 #!/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=$?

有几种方法可以做到这一点。执行脚本的终端:

#!/bin/bashSCRIPT_PATH="/path/to/script.sh"
# Here you execute your script"$SCRIPT_PATH"
# or. "$SCRIPT_PATH"
# orsource "$SCRIPT_PATH"
# orbash "$SCRIPT_PATH"
# oreval '"$SCRIPT_PATH"'
# orOUTPUT=$("$SCRIPT_PATH")echo $OUTPUT
# orOUTPUT=`"$SCRIPT_PATH"`echo $OUTPUT
# or("$SCRIPT_PATH")
# or(exec "$SCRIPT_PATH")

所有这些对于有空格的路径都是正确的!!!

简单的源代码会帮助你。前……

#!/bin/bashecho "My shell_1"source my_script1.shecho "Back in shell_1"

从其他文件导入函数存在一些问题。
第一:您不必执行此文件可执行文件。最好不要这样做!只需添加

. file

导入所有函数。所有这些都将像它们在您的文件中定义一样。
第二个:你可能会定义同名的函数。它会被覆盖。这很糟糕。你可以这样声明

declare -f new_function_name=old_function_name

之后才导入。所以你可以用新名字调用旧函数。
第三:您只能导入文件中定义的函数的完整列表。如果有些不需要,您可以取消设置它们。但如果您在取消设置后重写您的函数,它们将丢失。但如果您按照上述方式设置对它的引用,您可以在取消设置后以相同的名称恢复。
终于在普通的导入过程中是危险的,并不那么简单。小心!您可以编写脚本来更容易和安全地执行此操作。如果你只使用部分函数(不是全部),最好将它们拆分到不同的文件中。不幸的是,这种技术在bash中没有很好地发挥作用。在python和其他一些脚本语言中,它既简单又安全。可以使用自己的名称进行部分导入只需要函数。我们都希望在下一个布什版本中将完成相同的功能。但是现在我们必须编写许多额外的代码来做你想要的。

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

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

感谢@Nathan Lilienthal的评论

最上面的答案建议在被调用的子脚本的第一行添加#!/bin/bash行。但是即使你添加了sheband,*在子shell中运行脚本并捕获输出要快得多:

$(source SCRIPT_NAME)

当您想继续运行相同的解释器(例如从bash到另一个bash脚本)并确保不执行子脚本的sheband行时,这是有效的。

例如:

#!/bin/bashSUB_SCRIPT=$(mktemp)echo "#!/bin/bash" > $SUB_SCRIPTecho 'echo $1' >> $SUB_SCRIPTchmod +x $SUB_SCRIPTif [[ $1 == "--source" ]]; thenfor X in $(seq 100); doMODE=$(source $SUB_SCRIPT "source on")doneelsefor X in $(seq 100); doMODE=$($SUB_SCRIPT "source off")donefiecho $MODErm $SUB_SCRIPT

输出:

~ ❯❯❯ time ./test.shsource off./test.sh  0.15s user 0.16s system 87% cpu 0.360 total
~ ❯❯❯ time ./test.sh --sourcesource on./test.sh --source  0.05s user 0.06s system 95% cpu 0.114 total

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

使用反引号。

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

然后获取生产者脚本的输出作为消费者脚本上的参数。

如果您在同一目录中有另一个文件,您可以执行以下操作:

bash another_script.sh

source another_script.sh

. another_script.sh

当您使用bash而不是source时,脚本无法更改父脚本的环境。.命令是POSIX标准,而source命令是.的可读性更强的bash同义词(我更喜欢source而不是.)。如果您的脚本驻留在其他地方,只需提供该脚本的路径。相对路径和完整路径都应该有效。

这对我来说是有效的,这是执行另一个的主sh脚本的内容。

#!/bin/bashsource /path/to/other.sh