我有两个shell脚本a.sh
和b.sh
。
如何b.sh
在Shell脚本中调用a.sh
?
b.sh
没有可执行权限。检查可能是一件好事。
./
例如,在脚本名称前添加:b.sh
,使用:./b.sh
No such file or directory
错误stackoverflow.com/a/2920431/1356559
我有两个shell脚本a.sh
和b.sh
。
如何b.sh
在Shell脚本中调用a.sh
?
b.sh
没有可执行权限。检查可能是一件好事。
./
例如,在脚本名称前添加:b.sh
,使用:./b.sh
No such file or directory
错误stackoverflow.com/a/2920431/1356559
Answers:
您可以通过几种不同的方式来执行此操作:
使其他脚本可执行,#!/bin/bash
在顶部添加一行,并将文件添加到$ PATH环境变量的路径。然后,您可以将其作为普通命令来调用;
或与调用它source
的命令(别名.
)是这样的:source /path/to/script
;
或者使用bash
命令来执行它:/bin/bash /path/to/script
;
第一个和第三个方法将脚本作为另一个过程执行,因此另一个脚本中的变量和函数将不可访问。
第二种方法在第一个脚本的过程中执行该脚本,并从另一个脚本中提取变量和函数,以便可以从调用脚本中使用它们。
在第二种方法中,如果要exit
在第二个脚本中使用,它将同样退出第一个脚本。第一种和第三种方法不会发生这种情况。
chmod a+x /path/to/file
否则它将无法执行。仅适用于./script方法。
source
中的一条exit
语句也会退出您的...
.
不是的别名source
,而是相反的别名。source
是bash扩展,.
可在任何POSIX兼容shell中使用。
看一下这个。
#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
sh <path to script>/script.sh
bash
和sh
。即使sh
事实上,bash
它的行为也不一样。如果您正在使用,#!/bin/bash
则可能要使用bash script.sh
(或仅./script.sh
使用该脚本的hashbang)。
chmod +x
为.sh文件,也保持获得拒绝权限的错误。有什么建议么?
您可以通过两种方法来执行此操作。终端执行脚本:
#!/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")
所有这些对于带空格的路径都是正确的!!!
我一直在寻找答案:
( exec "path/to/script" )
如前所述,exec
在不创建新进程的情况下替换了外壳。但是,我们可以将其放在子外壳中,这是通过使用括号实现的。
编辑:其实( "path/to/script" )
足够了。
/path/to/script
?exec
在这里我根本不需要吗?
exec
。
取决于。简而言之...如果您想在当前控制台上加载变量并执行,则可以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
希望对您有帮助。谢谢。
source
是特定于bash的功能。标准bourne外壳仅具有.
(例如. other_script.sh
)。
您可以/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
showdate.sh
在/ bin / sh下而不是/ bin / bash下运行吗?
/bin/sh ./showdate.sh
”,“ /bin/bash ./showdate.sh
”,“ ./showdate.sh
”并运行文件:mainscript.sh并获得了相同的输出。
只需在命令行中添加您在终端中键入的任何内容即可执行脚本!
例如:
#!bin/bash
./myscript.sh &
如果要执行的脚本不在同一目录中,请使用脚本的完整路径。
例如:`/ home / user / script-directory /./ myscript.sh&
&
负责后台任务
首先,您必须包括要调用的文件:
#!/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"
如果您在同一目录中还有另一个文件,则可以执行以下操作:
bash another_script.sh
要么
source another_script.sh
要么
. another_script.sh
当您使用bash
而不是时source
,脚本不能更改父脚本的环境。该.
命令是POSIX标准而source
命令为更可读的bash同义词.
(我喜欢source
过.
)。如果您的脚本位于其他位置,请提供该脚本的路径。相对路径和完整路径都应该起作用。
最佳答案建议#!/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毫秒。
pathToShell="/home/praveen/"
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
#!/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=$?
scriptPath
或文件名不正确scriptName
假设新文件是“ / 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
在命令行中立即看到效果,以防万一。
从其他文件导入功能存在一些问题。
首先:您不需要执行此文件可执行文件。最好不要这样做!只需添加
. file
导入所有功能。所有这些都好像它们是在文件中定义的一样。
第二:您可以使用相同的名称定义函数。它将被覆盖。这不好。您可以这样声明
declare -f new_function_name=old_function_name
并且只有在此之后才导入。因此,您可以使用新名称调用旧函数。
第三:您只能导入文件中定义的完整功能列表。如果不需要,可以取消设置。但是,如果您在取消设置后重写函数,它们将会丢失。但是,如果您如上所述设置对它的引用,则可以在取消设置后使用相同的名称进行恢复。
最后通常,导入过程很危险,而不是那么简单。小心!您可以编写脚本来更轻松,更安全地执行此操作。如果仅使用部分功能(不是全部),最好将其拆分为不同的文件。不幸的是,这项技术在bash中效果不佳。以python和其他一些脚本语言为例,它既简单又安全。可以使用自己的名称仅部分导入所需的功能。我们都希望在下一个版本中,布什将具有相同的功能。但是现在我们必须写很多其他的鳕鱼才能做你想做的。