如何从另一个shell脚本调用shell脚本?
我有两个shell脚本, b.sh
和b.sh
如何从shell脚本b.sh
调用b.sh
?
有几种方法可以做到这一点:
-
使其他脚本可执行,在顶部添加
#!/bin/bash
行,并将文件的path添加到$ PATH环境variables中。 那么你可以把它作为一个普通的命令来调用。 -
使用
source
命令(别名是)调用它:source /path/to/script
。 -
使用
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。 但现在我们必须写很多额外的鳕鱼,以便做你想要的。