shell脚本的执行几种方式的区别

本文详细解析了Shell脚本的四种主要执行方式:bash或sh执行、直接调用、source加载以及管道输入,对比了它们在变量作用域上的区别,并通过实例说明了如何根据需求选择合适的执行方式。

shell脚本的执行几种方式的区别

bash xx.sh 或者sh xxx.sh

脚本没有可执行权限或没有指定解析器,使用的方法。

会产生一个子shell来执行脚本,脚本执行完毕后再返回父shell,所以脚本里面的变量获取不了。

 

/xxx/xxx.sh 或 ./xxx.sh

脚本需要有执行权限,通过chmod +x xxx.sh来添加即可。

会产生一个子shell来执行脚本,脚本执行完毕后再返回父shell,所以脚本里面的变量获取不了。

 

source xxx.sh 或者 . xxx.sh

先读入或加载xxx.sh脚本,然后从上到下依次执行脚本。是在当前的shell执行脚本,脚本中的变量可以正常获取输出!

source 和 . 相当于include的功能!

在一个脚本中需要引用另一个脚本,直接source script.sh 然后这个脚本产生的变量可以在当前脚本中使用了。如果是sh script.sh则变量获取不了。

 

sh < xxx.sh 或者 cat xxx.sh|sh

 

例子:

[xxx@hostname ~]$ cat b.sh        //b.sh脚本内容如下
user=`whoami`

[xxx@hostname ~]$ ./b.sh          //没有chmod +x 使用路径直接执行,包没有权限
-bash: ./b.sh: Permission denied

[xxx@hostname ~]$ bash b.sh      //没有执行权行或没有指定解析器,使用sh 执行

[xxx@hostname ~]$ echo $user     //脚本产生的变量为空!!因为sh 执行变量保存到子shell中了


[xxx@hostname ~]$ source b.sh   //需要在当前父shell获取脚本产生的变量,使用source 

[xxx@hostname ~]$ echo $user      // 脚本的变量可以获取
xxx

 

 

<think>好的,我需要回答用户关于Shell脚本执行方式的问题。用户之前提到想了解几种执行方式,根据提供的引用,我需要整理出不同的方法并解释它们的区别。 首先,引用中提到了四种执行方式,比如方法三不需要执行权限,因为脚本作为参数传给sh。引用1提到方法三使用sh xxx.sh,不需要执行权限,也不需要指定shebang。引用2中的例子展示了子shell当前shell执行区别,比如使用./script.sh. ./script.sh。引用3提到使用bash执行会改变解释器类型,比如用sh执行会使用/bin/sh而不是脚本中指定的/bin/bash。 接下来,我需要将执行方式分类。常见的方法包括: 1. 使用绝对或相对路径执行,需要可执行权限,例如./script.sh。 2. 使用解释器命令执行,如sh script.sh,不需要执行权限。 3. 使用source或.来在当前shell执行,影响当前环境变量。 4. 通过重定向输入,比如bash < script.sh,较少用。 5. 将脚本加入环境变量PATH,直接输入脚本执行。 需要详细说明每种方法的语法、是否需要执行权限、是否启动子shell、是否影响当前环境等。例如,./script需要x权限,启动子shell;source执行则不需要权限,且变量会影响当前shell。还要注意解释器的变化,如sh script.sh可能覆盖shebang指定的解释器。 然后,要生成相关问题,可能涉及执行方式区别、如何选择执行方式、权限问题、环境变量影响等。比如问题可以包括不同执行方式区别,如何保留变量,权限错误处理等。 最后,确保回答结构清晰,分点列出执行方式,并附上示例代码。引用对应的参考资料,例如引用1引用3提到的执行权限解释器变化,引用2中的子shell例子。需要正确标注引用标记,如[^1][^3]。</think>### Shell脚本的5种执行方式区别 #### 1. **路径直接执行(需执行权限)** ```bash ./demo.sh ``` - **要求**:必须添加执行权限 `chmod +x demo.sh` - **特点**:启动子Shell进程执行脚本,变量不污染父Shell[^2] - **解释器**:依赖脚本首行 `#!/bin/bash` 声明 #### 2. **指定解释器执行(无需执行权限)** ```bash bash demo.sh # 或 sh demo.sh ``` - **权限**:无需 `x` 权限 - **特点**:强制使用指定解释器(如 `sh` 可能覆盖脚本声明的解释器)[^3] - **示例**:`sh demo.sh` 会以 `/bin/sh` 执行,即使脚本声明了 `#!/bin/bash` #### 3. **当前Shell环境执行(影响父进程)** ```bash source demo.sh # 或 . demo.sh ``` - **权限**:无需 `x` 权限 - **特点**:脚本变量会直接影响当前Shell环境[^2] - **场景**:常用于加载环境变量配置文件 #### 4. **管道/重定向输入执行** ```bash bash < demo.sh cat demo.sh | bash ``` - **权限**:无需 `x` 权限 - **特点**:将脚本内容作为标准输入传递给解释器 #### 5. **环境变量路径执行** ```bash # 将脚本放入PATH路径后直接调用 mkdir ~/bin && mv demo.sh ~/bin/demo demo ``` - **要求**:需要将脚本目录加入 `PATH` 变量 - **特点**:实现类似系统命令的调用方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值