#!/bin/sh & #!/bin/bash区别

本文探讨了#!/bin/sh与#!/bin/bash在Shell脚本中的区别,特别是在source命令失败后的处理方式。当使用#!/bin/sh时,若source失败,后续代码将不再执行;而#!/bin/bash则会继续执行后续代码,除非显式启用POSIX模式。

#!/bin/sh & #!/bin/bash区别

作为笔记用,如果侵权,请告知,将立即删除

在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本。
目前研发送测的shell脚本中主要有以下两种方式:
(1) #!/bin/sh
(2) #!/bin/bash
以上两种方式有什么区别?对于脚本的实际运行会产生什么不同的影响吗?

脚本test.sh内容:
#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello
执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
由此可见,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。
修改test.sh脚本的第一行,变为#!/bin/bash,再次执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
hello
由此可见,在#!/bin/bash的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
但是紧接着我又试着运行了一下sh ./test.sh,这次屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。

为什么会有这样的区别呢?

 

说明:

1. sh一般设成bash的软链
[work@zjm-testing-app46 cy]$ ll /bin/sh
lrwxrwxrwx 1 root     root          4 Nov 13   2006 /bin/sh -> bash
2. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
3. 也就是说 /bin/sh 相当于 /bin/bash --posix

所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别

so,可以预想的是,如果第一行写成 #!/bin/bash --posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)

### 差异分析 当编写Shell脚本时,`#!/bin/sh` 和 `#!/bin/bash` 是两种常见的解释器声明方式。这两种声明会影响脚本的行为和兼容性。 #### 解释器路径不同 通常情况下,`/bin/sh` 提供的是SH shell,这是一个功能较少的BASH版本[^2]。而 `/bin/bash` 则指向完整的Bash Shell环境。这意味着使用 `#!/bin/sh` 的脚本应该只依赖POSIX标准定义的功能集,而不应假设存在特定于Bash的功能特性。 #### 功能差异 由于 `/bin/sh` 实际上可能是其他shell的一个简化版或者是严格遵循POSIX规范实现的结果,在某些发行版中它可能并不完全等同于Bash。因此: - **命令解析**:一些高级语法结构如数组、更复杂的条件表达式以及部分内置函数仅能在Bash下正常工作。 -word}` 这样的参数替换形式虽然被广泛接受,但在严格的 POSIX 模式的sh里可能会有不同的行为或不被支持。 - **字符串处理**:双引号内的特殊字符转义规则也有所不同;在Bash中可以更好地保留字面意义传递给调用命令[^3]。 为了确保最大范围内的可移植性和最小化意外错误的风险,如果确实需要利用到更多特性的场合,则应当显式指定为 `#!/bin/bash` 来运行整个程序逻辑。 ```bash #!/bin/bash echo "This script uses bash specific features." array=(one two three) # Array declaration which works only in bash for element in "${array[@]}"; do echo "$element" done ``` 相反地,对于那些只需要基本操作且希望保持高度兼容性的场景来说,采用 `#!/bin/sh` 可能是一个更好的选择。 ```bash #!/bin/sh echo "This script aims for maximum portability across Unix-like systems." if test -f "/path/to/file"; then cat /path/to/file fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值