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

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

我怎么能叫b.sh从shell脚本中a.sh


#1楼

看一下这个。

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

#2楼

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

#3楼

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

#4楼

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

#!bin/bash

export FAV_NUMBER="2211"

将此文件引用附加到〜/ .bashrc文件

source /home/satya/app/app_specific_env

每当您重新启动计算机或重新登录时, echo $FAV_NUMBER在终端中尝试echo $FAV_NUMBER 。 它将输出值。

万一您想立即看到效果,请在命令行中输入source ~/.bashrc


#5楼

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

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

然后您可以像这样调用函数:

#!/bin/bash
my_called_function

#6楼

我一直在寻找答案:

( exec "path/to/script" )

如前所述, exec无需创建新进程即可替换shell。 但是 ,我们可以将其放在子外壳中,这是通过使用括号实现的。

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


#7楼

只需在命令行中添加您在终端中键入的任何内容即可执行脚本!
例如:

#!bin/bash
./myscript.sh &

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


#8楼

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

希望对您有帮助。 谢谢。


#9楼

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

您可以通过两种方法来执行此操作。 终端执行脚本:

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

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


#11楼

简单的资源将为您提供帮助。 对于前

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

#12楼

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

. file

导入所有功能。 所有这些都好像它们是在文件中定义的一样。
第二 :您可以使用相同的名称定义函数。 它将被覆盖。 这不好。 您可以这样声明

declare -f new_function_name=old_function_name 

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


#13楼

chmod a+x /path/to/file-to-be-executed

那是我唯一需要的。 一旦将要执行的脚本变成这样的可执行文件,在调用脚本时,您(至少在我看来)不需要任何其他额外操作,例如sh./

感谢@Nathan Lilienthal的评论


#14楼

最佳答案建议在要调用的子脚本的第一行中添加#!/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毫秒。


#15楼

使用反引号。

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

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


#16楼

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

bash another_script.sh

要么

source another_script.sh

要么

. another_script.sh

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


#17楼

您可以通过几种不同的方式来执行此操作:

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值