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

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

如何从shell脚本b.sh调用b.sh

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

  1. 使其他脚本可执行,在顶部添加#!/bin/bash行,并将文件的path添加到$ PATH环境variables中。 那么你可以把它作为一个普通的命令来调用。

  2. 使用source命令(别名是)调用它: source /path/to/script

  3. 使用bash命令执行它: /bin/bash /path/to/script

第一个和第三个方法将脚本作为另一个进程执行,因此其他脚本中的variables和函数将不可访问。
第二种方法在第一个脚本的进程中执行脚本,并从另一个脚本中提取variables和函数,使其可以从调用脚本中使用。

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

看一下这个。

 #!/bin/bash echo "This script is about to run another script." sh ./script.sh echo "This script has just run another script." 

我正在寻找的答案是:

 ( exec "path/to/script" ) 

如上所述, exec在不创build新进程的情况下replaceshell。 但是 ,我们可以把它放在一个子shell中,这是使用没有限制的。

编辑:其实( "path/to/script" )就足够了。

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

 #!/bin/bash $SCRIPT_PATH="/path/to/script.sh" # Here you execute your script "$SCRIPT_PATH" # or . "$SCRIPT_PATH" # or source "$SCRIPT_PATH" # or bash "$SCRIPT_PATH" # or eval '"$SCRIPT_PATH"' # or OUTPUT=$("$SCRIPT_PATH") echo $OUTPUT # or OUTPUT=`"$SCRIPT_PATH"` echo $OUTPUT # or ("$SCRIPT_PATH") # or (exec "$SCRIPT_PATH") 

所有这一切都是正确的与空间的path!

依赖于取决于。 简而言之…如果你想在当前控制台加载variables并执行,你可以在代码中使用source myshellfile.sh 。 例:

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

如果你只是想执行一个文件,唯一的事情是你的结果,你可以这样做:

 !#/bin/bash set -x ./executing_only.sh sh i_can_execute_this_way_too.sh bash or_this_way.sh set +x 

我希望能帮助你。 谢谢。

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

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

输出将是:

  # ./mainscript.sh You are login as: root Date is: Thu Oct 17 02:56:36 EDT 2013 

首先你必须包含你所调用的文件:

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

那么你可以这样调用你的函数:

 #!/bin/bash my_called_function 

只要添加一行就可以在terminalinput任何内容来执行脚本!
例如:

 #!bin/bash ./myscript.sh & 

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

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

假设新文件是“/ home / satya / app / app_specific_env”,文件内容如下

 #!bin/bash export FAV_NUMBER="2211" 

追加这个文件引用〜/ .bashrc文件

 source /home/satya/app/app_specific_env 

当您重新启动机器或重新login时,请尝试在terminal中echo $FAV_NUMBER 。 它会输出值。

以防万一,如果你想立即看到效果,请在命令行inputsource ~/.bashrc

  #!/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/bash echo "My shell_1" source my_script1.sh echo "Back in shell_1" 

从其他文件导入function有一些问题。
第一 :你不需要做这个文件的可执行文件。 最好不要这样做! 只需添加

 . file 

导入所有function。 所有这些都将在您的文件中定义。
第二 :你可以定义同名的函数。 它将被覆盖。 这不好。 你可以这样申报

 declare -f new_function_name=old_function_name 

只有在这之后才能import。 所以你可以用新名称来调用旧函数。
第三 :您只能导入文件中定义的完整function列表。 如果有些不需要,你可以解除它们。 但是如果你在重写之后重写你的函数,它们将会丢失。 但是,如果您按照上述说明设置引用,则可能会在使用相同名称取消设置后进行恢复。
最后在通常的import程序是危险的,并不那么简单。 小心! 你可以写脚本来做到这一点更容易和安全。 如果只使用部分function(不是全部),可以更好地将它们分成不同的文件。 不幸的是这种技术在bash中效果不好。 在python例如和其他一些脚本语言,它很容易和安全。 可以使用自己的名字来部分导入只需要的函数。 我们都希望在下一个布什版本将被完成相同的function。 但现在我们必须写很多额外的鳕鱼,以便做你想要的。