How to call shell script from another shell script?
我有两个shell脚本,
如何从shell脚本中调用
有几种不同的方法可以做到这一点:
使另一个脚本可执行,在顶部添加
或者用
或使用
第一个和第三个方法将脚本作为另一个进程执行,因此其他脚本中的变量和函数将不可访问。第二个方法在第一个脚本的进程中执行脚本,并从另一个脚本中提取变量和函数,以便从调用脚本中使用它们。
在第二个方法中,如果在第二个脚本中使用
看看这个。
1 2 3 4 | #!/bin/bash echo"This script is about to run another script." sh ./script.sh echo"This script has just run another script." |
有几种方法可以做到这一点。要执行脚本的终端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/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") |
所有这些对于带有空格的路径都是正确的!!!!
我正在寻找的答案是:
1 | ( exec"path/to/script" ) |
如前所述,
编辑:实际上,
您可以使用
1 2 3 4 5 6 7 8 | # 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 |
输出将是:
1 2 3 | # ./mainscript.sh You are login as: root Date is: Thu Oct 17 02:56:36 EDT 2013 |
取决于。简要地。。。如果希望在当前控制台上加载变量并执行,可以在代码上使用
1 2 3 4 5 6 7 8 9 | !#/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 |
如果您只想执行一个文件,而唯一让您感兴趣的是结果,那么您可以这样做:
1 2 3 4 5 6 | !#/bin/bash set -x ./executing_only.sh sh i_can_execute_this_way_too.sh bash or_this_way.sh set +x |
我希望能帮助你。谢谢。
只需添加一行您在终端中键入的任何内容即可执行脚本!例如。:
1 2 | #!bin/bash ./myscript.sh & |
如果要执行的脚本不在同一目录中,只需使用脚本的完整路径即可。例如:`/home/user/script directory//myscript.sh&;
简单的来源会帮助你。为Ex.
1 2 3 4 | #!/bin/bash echo"My shell_1" source my_script1.sh echo"Back in shell_1" |
首先,您必须包含您调用的文件:
1 2 | #!/bin/bash . includes/included_file.sh |
然后这样调用函数:
1 2 | #!/bin/bash my_called_function |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/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 2 3 | pathToShell="/home/praveen/" chmod a+x $pathToShell"myShell.sh" sh $pathToShell"myShell.sh" |
假设新文件是"/home/satya/app/app_-specific_-env",文件内容如下
1 2 3 | #!bin/bash export FAV_NUMBER="2211" |
将此文件引用附加到~/.bashrc文件
1 | source /home/satya/app/app_specific_env |
当您重新启动机器或重新启动时,请在终端中尝试
以防万一,如果你想马上看到效果,命令行中的
1 | chmod a+x /path/to/file-to-be-executed |
那是我唯一需要的。一旦要执行的脚本可以这样执行,您(至少在我的情况下)在调用脚本时不需要任何其他额外的操作,如
感谢@nathan lilienthal的评论
最上面的答案建议在被调用的子脚本的第一行添加
当您希望继续运行同一个解释器(例如从bash到另一个bash脚本)时,这会起作用,并确保不会执行子脚本的shebang行。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/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 |
输出:
1 2 3 4 5 6 7 | ~ ??? 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毫秒。
使用背板。
1 | $ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh` |
然后获取生产者脚本的输出作为使用者脚本上的参数。
从其他文件导入函数时出现一些问题。首先:您不需要执行这个文件。最好不要这样做!只要添加
1 | . file |
导入所有函数。所有这些都将像在您的文件中定义的一样。第二:可以用相同的名称定义函数。它将被覆盖。很糟糕。你可以这样申报
1 | declare -f new_function_name=old_function_name |
只有在那之后才能导入。所以您可以用新名称调用旧函数。第三:只能导入文件中定义的完整函数列表。如果不需要的话,你可以取消它们。但是,如果在取消设置后重写函数,它们将丢失。但是,如果您按照上面的描述设置了对它的引用,则可以在使用相同的名称取消设置之后进行恢复。最后,在一般进口程序中是危险的,并不那么简单。小心!您可以编写脚本,这样做更容易和安全。如果只使用部分函数(而不是全部函数),最好将它们拆分为不同的文件。不幸的是,这种技术在bash中做得不好。例如,在Python和其他一些脚本语言中,它既简单又安全。可以使部分导入只需要具有自己名称的函数。我们都希望在下一个布什版本中实现相同的功能。但现在我们必须写更多的货到付款,以便做你想做的。