2024-09-01
Linux运维
00

目录

1. source命令
2. sh/bash命令
3. ./方式
4. fork、source、exec方式

在Linux系统中,执行Shell脚本的方式有source、sh、bash、以及./等多种,它们之间存在一些差异。下面将以更加通俗易懂的方式解释它们的区别及用法。

1. source命令

使用source.命令时,你可以在当前Shell中直接运行一个Shell脚本,而不需要给脚本添加执行权限。这就像是把脚本内容直接放到当前Shell中执行一样。

bash
source script_a.sh

或者

bash
. script_a.sh

注意,在.命令和脚本文件之间有一个空格。

2. sh/bash命令

通过shbash命令执行脚本时,会在一个新的子Shell中运行脚本,而且脚本不需要有执行权限。子Shell是一个独立的执行环境,脚本中设置的变量不会影响到父Shell。

bash
sh script_a.sh

或者

bash
bash script_a.sh

3. ./方式

使用./方式执行脚本时,会在一个新的子Shell中运行脚本,但是此时脚本需要有执行权限。可以使用chmod +x添加执行权限。

bash
chmod +x script_a.sh ./script_a.sh

另外,使用./方式执行的文件如果包含alias语句,Shell不会将alias别名扩展成对应的命令。解决这个问题可以使用shopt命令开启alias扩展选项:

bash
shopt -s expand_aliases

4. fork、source、exec方式

  • 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"

运行命令:

bash
chmod +x main_script.sh chmod +x sub_script.sh ./main_script.sh fork ./main_script.sh source ./main_script.sh exec

通过观察运行结果,你将更好地理解这些方式的区别。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!