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

时间:2011-12-02 07:05:18

标签: bash shell

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

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

18 个答案:

答案 0 :(得分:786)

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

  1. 使其他脚本可执行,在顶部添加#!/bin/bash行,在$ PATH环境变量中添加文件所在的路径。然后你可以把它称为普通命令;

  2. 或者使用source命令(别名为.)调用它,如下所示:source /path/to/script;

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

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

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

答案 1 :(得分:188)

检查一下。

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

答案 2 :(得分:83)

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

#!/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")

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

答案 3 :(得分:56)

我正在寻找的答案:

( exec "path/to/script" )

如上所述,exec替换shell而不创建新进程。 然而,我们可以将它放在子shell中,这是使用parantheses完成的。

编辑: 实际上( "path/to/script" )已经足够了。

答案 4 :(得分:14)

您可以使用/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

答案 5 :(得分:14)

取决于。 简单地说... 如果您想在当前控制台上执行加载变量并执行,则可以在代码上使用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

我希望能帮助你。 感谢。

答案 6 :(得分:10)

只需添加一行,即可在终端中输入任何内容来执行脚本! e.g:

#!bin/bash
./myscript.sh &

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

答案 7 :(得分:8)

简单的来源会帮助你。 对于前。

#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"

答案 8 :(得分:8)

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

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

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

#!/bin/bash
my_called_function

答案 9 :(得分:4)

 #!/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=$?

答案 10 :(得分:4)

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

答案 11 :(得分:3)

假设新文件是“/ 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,以防万一。

答案 12 :(得分:2)

const img = new Image(); 
img.onload = () => {
    console.log('Images is loaded and exists!');
}
img.onerror = () => {
    console.log('Image could not be loaded for whatever reason.');
}
img.src = 'blabla'

这是我唯一需要的东西。一旦要执行的脚本像这样执行,您(至少在我的情况下)在调用脚本时不需要任何其他额外的操作,如chmod a+x /path/to/file-to-be-executed sh。 / p>

感谢@Nathan Lilienthal的评论

答案 13 :(得分:2)

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

$(source SCRIPT_NAME)

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

例如:

#!/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

输出:

~ ❯❯❯ 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毫秒。

答案 14 :(得分:1)

使用反引号。

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

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

答案 15 :(得分:1)

这对我有用,这是执行另一个脚本的主要sh脚本的内容。

#!/bin/bash 
source /path/to/other.sh

答案 16 :(得分:0)

从其他文件导入功能有一些问题 首先:您无需执行此文件可执行文件。最好不要这样做! 只需添加

. file

导入所有功能。所有这些都将如同在您的文件中定义一样 第二:您可以定义具有相同名称的功能。它将被覆盖。这很糟糕。你可以这样声明

declare -f new_function_name=old_function_name 

然后才进行导入。 因此,您可以通过新名称调用旧功能 第三:您只能导入文件中定义的完整功能列表。 如果有些不需要你可能会取消它们。但如果你在未设置后重写你的功能,它们将会丢失。但是如果您按照上面的说明设置对它的引用,则可以在取消设置后使用相同的名称进行恢复 最后在导入的常见程序中是危险的而不是那么简单。小心!您可以编写脚本来更轻松,更安全地执行此操作。 如果只使用部分功能(不是全部),最好将它们分成不同的文件。不幸的是,这种技术在bash中表现不佳。例如在python和其他一些脚本语言中,它简单而安全。可以使用自己的名称仅部分导入所需的函数。我们都希望在下一个丛林版本中将完成相同的功能。但是现在我们必须写出许多额外的鳕鱼,以便做你想做的事。

答案 17 :(得分:0)

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

bash another_script.sh

source another_script.sh

. another_script.sh

当您使用bash而不是source时,脚本无法更改父脚本的环境。 .命令是POSIX标准,而source命令是.的更易理解的bash同义词(相对于source,我更喜欢.)。如果您的脚本位于其他位置,请提供该脚本的路径。相对路径和完整路径都应该起作用。