关于#!/bin/sh 和 #!/bin/bash 的差别

本文探讨了Shell脚本中#!/bin/sh与#!/bin/bash的区别。通过示例验证了两种方式下source命令失败后的处理不同,进一步解释了这源于bash是否启用POSIX模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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后面的代码。

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


junru同学作了解释

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、付费专栏及课程。

余额充值