a.sh
和 b.sh
。如何在脚本
a.sh
中调用 b.sh
?有几种不同的方法可以做到这一点:
将另一个脚本设为可执行,使用chmod a+x /path/to/file
(Nathan Lilienthal的评论),在顶部添加#!/bin/bash
行(称为shebang),并将文件所在路径添加到$PATH
环境变量中。然后您可以像普通命令一样调用它;
或者使用source
命令调用(它是.
的别名),像这样:
source /path/to/script
或者使用bash
命令执行它,例如:
/bin/bash /path/to/script
第一种和第三种方法以另一个进程的方式执行脚本,因此在另一个脚本中的变量和函数将无法访问。
第二种方法在第一个脚本的进程中执行脚本,并从另一个脚本中引入变量和函数(可从调用脚本中使用)。当然,它将运行其他脚本中的所有命令,而不仅仅是设置变量。
在第二种方法中,如果在第二个脚本中使用 exit
,它也会退出第一个脚本。这在第一和第三种方法中不会发生。
./.git/hooks/pre-commit
包含 source foo
,则最好确保有 ./foo
!(此句话意思是说,如果一个脚本中调用了另一个脚本,在执行时需要确保被调用的脚本存在于指定路径下) - Athan Clark.
不是 source
的别名,而是相反的情况。source
是 Bash 的扩展命令,而 .
可以在任何符合 POSIX 标准的 shell 中使用。 - Score_UnderSCRIPT_DIRECTORY="$(dirname $(realpath "$0"))"
来构建脚本路径,然后调用它:source $SCRIPT_DIRECTORY/script.sh
。 - Danijel看这个。
#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
sh <脚本路径>/script.sh
。 - Morgan Kenyonbash
和sh
。即使sh
实际上是bash
,它的行为也不同。如果你正在使用#!/bin/bash
,那么你可能想要使用bash script.sh
(或者只需使用该脚本的散列标记./script.sh
)。 - Martin Tournoijchmod +x
设置为.sh文件,仍然不断收到权限被拒绝的错误。有什么建议吗? - isaac weatherssudo chmod +x
。 - not2savvy你可以有几种方法来实现这一点。使用终端执行脚本:
#!/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")
所有这些对于带有空格的路径都是正确的!!!
"$SCRIPT_PATH"
、source
和.
都不起作用。但是./
、/bin/bash
或更短的bash
都可以使用。 - postalsource
是 .
的同义词,参考 https://unix.stackexchange.com/a/459089/21027。 - maksimov我正在寻找的答案:
( exec "path/to/script" )
如上所述,exec
代替了Shell而不会创建新的进程。但是,我们可以将其放在子Shell中,使用括号实现。
编辑:
实际上 ( "path/to/script" )
就足够了。
exec
。 - Karel Vlk如果您在同一个目录中有另一个文件,则可以执行以下操作:
bash another_script.sh
或者source another_script.sh
. another_script.sh
当您使用bash
而不是source
时,脚本无法更改父脚本的环境变量。 .
命令是POSIX标准,而source
命令是对.
的更易读的bash同义词(我更喜欢source
而不是.
)。 如果您的脚本位于其他位置,请提供该脚本的路径。 相对路径和完整路径都应该可以工作。取决于。
简而言之...
如果你想在当前控制台加载变量并执行,可以在你的代码中使用source myshellfile.sh
。例如:
取决于。
简要地说...
如果您想要将变量加载到当前控制台并执行,则可以在您的代码中使用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
bash i_can_execute_this_way_too.sh
bash or_this_way.sh
set +x
source
是 Bash 特有的功能。标准 Bourne Shell 只有 .
(例如 . other_script.sh
)。 - Martin Tournoij您可以使用/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/sh ./showdate.sh
"、"/bin/bash ./showdate.sh
" 和 "./showdate.sh
",并运行了文件:mainscript.sh,得到了相同的输出。 - Ranjithkumar T首先,您必须包含所调用的文件:
#!/bin/bash
. includes/included_file.sh
#!/bin/bash
my_called_function
简单的源代码能够帮助您。
#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"
只需在一行中添加您将要在终端中键入以执行脚本的内容!
例如:
#!bin/bash
./myscript.sh &
如果要执行的脚本不在同一目录下,只需使用脚本的完整路径。
例如:`/home/user/script-directory/./myscript.sh &
b.sh
没有可执行权限。检查一下可能是个好主意。 - seth10./
,例如,使用./b.sh
而不是b.sh
。 - Benny