在Linux系统中,执行Shell脚本的方式有source、sh、bash、以及./等多种,它们之间存在一些差异。下面将以更加通俗易懂的方式解释它们的区别及用法。
使用source
或.
命令时,你可以在当前Shell中直接运行一个Shell脚本,而不需要给脚本添加执行权限。这就像是把脚本内容直接放到当前Shell中执行一样。
bashsource script_a.sh
或者
bash. script_a.sh
注意,在.
命令和脚本文件之间有一个空格。
通过sh
或bash
命令执行脚本时,会在一个新的子Shell中运行脚本,而且脚本不需要有执行权限。子Shell是一个独立的执行环境,脚本中设置的变量不会影响到父Shell。
bashsh script_a.sh
或者
bashbash script_a.sh
使用./
方式执行脚本时,会在一个新的子Shell中运行脚本,但是此时脚本需要有执行权限。可以使用chmod +x
添加执行权限。
bashchmod +x script_a.sh
./script_a.sh
另外,使用./
方式执行的文件如果包含alias语句,Shell不会将alias别名扩展成对应的命令。解决这个问题可以使用shopt
命令开启alias扩展选项:
bashshopt -s expand_aliases
fork方式: 使用fork方式运行脚本时,Shell会创建一个子进程去执行脚本。子进程结束后,会返回到父进程,但父进程的环境不会因子进程的改变而改变。
source方式: 使用source方式运行脚本时,脚本在当前进程内执行,不会创建新的子进程。如果脚本的环境有变化,会影响当前进程的环境。
exec方式: 使用exec方式运行脚本时,同样是在当前进程内执行脚本,但是原代码的剩余部分将被终止。进程内的环境会随着脚本的改变而改变。
通常情况下,默认为fork方式运行。
为了更好地理解这些方式,我们可以通过以下示例脚本来实践:
main_script.sh:
bash#!/bin/bash
VAR_A=B
echo "PID for main_script.sh before exec/source/fork:$$"
export VAR_A
echo "main_script.sh: \$VAR_A is $VAR_A"
case $1 in
exec)
echo "using exec..."
exec ./sub_script.sh ;;
source)
echo "using source..."
. ./sub_script.sh ;;
*)
echo "using fork by default..."
./sub_script.sh ;;
esac
echo "PID for main_script.sh after exec/source/fork:$$"
echo "main_script.sh: \$VAR_A is $VAR_A"
sub_script.sh:
bash#!/bin/bash
echo "PID for sub_script.sh: $$"
echo "sub_script.sh gets \$VAR_A=$VAR_A from main_script.sh"
VAR_A=C
export VAR_A
echo "sub_script.sh: \$VAR_A is $VAR_A"
运行命令:
bashchmod +x main_script.sh
chmod +x sub_script.sh
./main_script.sh fork
./main_script.sh source
./main_script.sh exec
通过观察运行结果,你将更好地理解这些方式的区别。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!