用source命令执行脚本和用sh执行脚本之间的区别

本文详细解析了在Linux环境下执行脚本的四种常见方式:source、.、sh和./,包括它们的作用、执行过程及结果差异。通过对比实例,清晰展示了每种方式的独特之处,帮助开发者理解脚本执行的不同行为。

问题:

有很多方式可以执行脚本,

1)。source test.bsh

2)。. test.bsh

3)。chmod a+x test.bsh;./test.bsh

4)。sh test.bsh

它们之间的差别是什么?


解决办法:

1. source命令的作用是读取并执行test.bsh中的命令;

该命令经常用点命令“.”来替代。

就是说,

# source test.bsh

# . test.bsh

的作用完全相同。

2. 用脚本文件名本身执行(如果shell脚本具有可执行权限)和用sh命令执行脚本的作用完全相同。

3. 用source命令执行脚本文件和用sh执行脚本文件的区别:

用source执行脚本文件,执行过程不另开进程,脚本文件中设定的变量在当前shell中可以看到;

用sh执行脚本文件,是在当前进程另开子进程来执行脚本命令,脚本文件中设定的变量在当前shell中不能看到。


比如:

test.bsh的内容如下:

#!/bin/bash
echo $$
tstvar=12345

以下是上面四种不同方式执行结果的差异:
dingq@wd-u1110:~/wrk/tmp$ echo $$
2375
dingq@wd-u1110:~/wrk/tmp$ unset tstvar;source tst_sh.bsh;echo $tstvar
2375
12345
dingq@wd-u1110:~/wrk/tmp$ unset tstvar;. tst_sh.bsh;echo $tstvar
2375
12345
dingq@wd-u1110:~/wrk/tmp$ unset tstvar;./tst_sh.bsh;echo $tstvar
5960

dingq@wd-u1110:~/wrk/tmp$ unset tstvar;sh tst_sh.bsh;echo $tst_var
5966

dingq@wd-u1110:~/wrk/tmp$

可以看到,当前进程ID为2375,用source和点命令(.)执行脚本时不改变当前进程,并且脚本中的变量可以看到;

而直接执行脚本文件和使用sh执行脚本时改变了当前进程,并且脚本中的变量不能看到;


问题解决。






<think>好的,我现在要回答用户关于Linux中exec命令执行脚本与直接运行脚本区别的问题。首先,我需要回忆一下自己之前学过的相关知识,并结合用户提供的引用内容来整理答案。 用户提到了三个引用,分别解释了exec命令在shell脚本中的行为,exec、sourcesh执行脚本区别,以及exec作为bash内部命令的特点。根据这些信息,我需要先理清每个执行方式的工作原理,然后比较它们的区别。 首先,直接运行脚本,比如使用./script.sh或者bash script.sh,通常会在当前shell的一个子进程中执行。子进程会继承父进程的环境变量,但子进程中的变量变化不会影响父进程。这是常见的执行方式,适用于需要保持当前shell环境不被修改的情况。 接下来是使用exec命令执行脚本,如exec ./script.sh。根据引用[2],exec会替换当前shell进程,而不是创建新的子进程。这意味着脚本执行完毕后,原来的shell进程会被终止,控制权不会返回到原来的shell。这点直接执行有很大不同,直接执行结束后会回到父shell,而exec执行后则不会。比如,如果用户在终端中执行exec script.sh脚本运行结束后终端会话可能会结束,因为原来的shell被替换了。 然后是使用source命令或者.来执行脚本,这种方式会在当前shell环境中执行脚本中的命令,所有变量的更改都会影响当前shell。比如,source script.sh后,脚本中设置的变量在终端中仍然有效。不过sourceexec的区别在于,source执行完后会继续执行后续命令,而exec会替换当前shell,后续命令不会执行。 另外,引用[1]提到,为了避免exec替换当前shell的影响,通常会把exec放在子脚本中,由主脚本调用,这样主脚本通过子shell执行exec命令,替换的是子shell而不是主脚本shell。这进一步说明了exec的行为取决于它所在的执行环境。 现在需要将这些信息结构化,明确不同执行方式的区别,包括进程创建、环境继承、执行后的控制流等方面。同时,需要结合用户提供的引用内容,确保回答准确且有依据。 可能还需要考虑权限问题,比如exec执行是否需要可执行权限,或者是否依赖于解释器。但根据常规情况,exec执行脚本直接执行一样,需要脚本执行权限,并且正确的shebang行。 最后,生成相关问题,需要围绕exec的不同使用场景、与其他执行方式的对比,以及实际应用中的注意事项来提问,帮助用户进一步理解。</think>在Linux系统中,`exec`命令执行脚本与直接运行脚本的核心区别在于**进程替换机制****执行上下文的影响**。以下是具体对比分析: --- ### 一、直接运行脚本的方式 1. **执行方式** 使用`./script.sh`或`bash script.sh`时,系统会**创建新的子进程**来执行脚本。 ```bash # 示例:启动子进程执行脚本 bash script.sh ``` 2. **进程关系** - 子进程继承父进程的环境变量,但**子进程的变量修改不会影响父进程**。 - 脚本执行完毕后,控制权**返回父进程**(如终端或主脚本)[^2]。 3. **典型场景** 需保持当前Shell环境独立,避免脚本操作污染当前会话。 --- ### 二、使用`exec`命令执行脚本 1. **执行方式** 通过`exec script.sh`调用时,**直接替换当前Shell进程**,不创建子进程。 ```bash # 示例:替换当前进程执行脚本 exec ./script.sh ``` 2. **进程关系** - **原Shell进程被脚本进程完全替代**,PID保持不变。 - 脚本结束后**不会返回原Shell**,若在终端中执行,终端会话将直接关闭[^1][^2]。 3. **典型场景** - 脚本作为进程的最终操作(如容器启动脚本)。 - 需要减少进程层级,优化资源占用。 --- ### 三、关键区别总结 | 特性 | 直接运行脚本 | `exec`执行脚本 | |---------------------|---------------------|-----------------------| | 进程创建 | 新建子进程 | **替换当前进程** | | 环境变量影响 | 子进程独立 | 继承并替换当前环境 | | 执行后控制权 | 返回父进程 | **不返回**,进程结束 | | 资源占用 | 多进程消耗资源 | 单进程,资源占用少 | --- ### 四、补充对比:`source`与`exec` - `source script.sh` 在当前Shell中逐行执行脚本,**保留环境变量修改**,且执行后继续运行后续命令[^3]。 - `exec script.sh` 替换当前Shell进程,**丢弃后续命令**,环境变量修改随进程结束消失。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值