a.sh
和 b.sh
。如何在脚本
a.sh
中调用 b.sh
?这是对我有用的方法,这是执行其他脚本的主要sh脚本的内容。
#!/bin/bash
source /path/to/other.sh
顶部的答案建议在调用子脚本的第一行添加#!/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"
chmod a+x /path/to/file-to-be-executed
我需要的只是这个。一旦将要执行的脚本像这样变成可执行文件,你(至少在我的情况下)在调用脚本时不需要任何其他额外操作,如sh
或./
。
感谢@Nathan Lilienthal的评论。
#!/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
中包含空格不正确。 - Andrei Krasutski#!bin/bash
export FAV_NUMBER="2211"
source /home/satya/app/app_specific_env
echo $FAV_NUMBER
。它将输出该值。source ~/.bashrc
。从其他文件导入函数可能会遇到一些问题。
首先:您不需要将此文件设置为可执行文件。最好不要这样做!只需添加即可。
. file
导入所有函数。它们都会像在你的文件中定义一样。
第二点:你可能会定义同名函数。这会被覆盖,不好。你可以这样声明
declare -f new_function_name=old_function_name
只有在这之后才进行导入。因此,您可以通过新名称调用旧函数。
第三条:您只能导入文件中定义的完整函数列表。如果某些函数不需要,您可以取消它们。但是,如果您在取消设置后重写函数,则会丢失它们。但是,如果您像上面描述的那样设置对其的引用,则可以使用相同的名称在取消设置后恢复。
最后,通常的导入过程是危险且不太简单的。请小心!您可以编写脚本以更轻松、安全地执行此操作。如果您仅使用部分函数(而不是全部),最好将它们拆分为不同的文件。不幸的是,在Bash中,这种技术并不好用。例如,在Python和其他一些脚本语言中,这很容易且安全。可以使用自己的名称进行部分导入所需的函数。我们都希望在下一个Bash版本中将完成相同的功能。但现在,我们必须编写许多额外的代码来实现您想要的功能。
使用反引号。
$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`
然后将生产者脚本的输出作为参数传递给消费者脚本。
b.sh
没有可执行权限。检查一下可能是个好主意。 - seth10./
,例如,使用./b.sh
而不是b.sh
。 - Benny