sh与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的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)

http://hi.baidu.com/%BF%EC%C0%D6%C6%BB%B9%FB/blog/item/695509230f9aec48925807b2.html

<think>好的,用户现在问的是bashsh后缀名的区别。我需要先回忆一下这两个文件后缀的相关知识,然后组织成清晰的中文回答。 首先,shShell脚本的传统后缀,通常指的是Bourne Shell或其兼容的shell,比如Bash。而.bash后缀明确指定使用Bash解释器。不过实际使用中,很多.sh文件其实也是用Bash来运行的,特别是当系统默认的/bin/sh链接到Bash的时候。 接下来要区分两种文件在解释器上的不同。sh文件一般以#!/bin/sh开头,而bash文件用#!/bin/bash。这里需要注意的是,尽管两者可能都使用Bash,但/bin/sh可能处于兼容模式,会禁用某些Bash特有的功能,导致脚本行为不同。 然后需要说明语法差异。Bash比传统的sh支持更多特性,比如数组、双括号的条件判断、字符串操作等。如果在.sh文件中用了这些特性,而用sh执行就会报错。因此,如果脚本中用到了Bash特有的功能,应该用.bash后缀,或者在shebang里指定bash。 另外,兼容性方面,sh脚本更注重可移植性,而bash脚本可能依赖特定扩展。用户可能需要考虑目标系统是否安装了Bash,尤其是在非Linux环境如BSD或旧系统中。 还要提到的是,后缀名本身不影响执行,关键看shebang行。但使用正确的后缀有助于维护和他人理解。比如用.sh的话,别人可能预期更通用的shell语法,而.bash则明确需要Bash。 最后,总结建议用户根据脚本内容选择后缀:如果用了Bash特性,用.bash或确保shebang是bash;若希望兼容,用.sh并遵循POSIX标准。同时,检查执行时的实际解释器,避免兼容问题。 需要确保回答结构清晰,分点列出,使用例子来说明。比如举一个使用数组的Bash脚本,如果以sh运行会出错。可能还需要提醒用户,即使后缀是.sh,如果用了Bash特性,也要用bash命令执行。 要避免使用Markdown格式,所以用编号和缩进即可。可能需要检查有没有遗漏的重要区别,比如启动模式的不同(sh作为bash的POSIX模式),或者是否某些系统默认的sh不是bash,比如dash。 总结下来,回答应该包括定义、解释器区别、语法差异、兼容性、后缀的实际影响以及使用建议。同时保持语言口语化,不用专业术语堆砌,让用户容易理解。</think>在Linux/Unix系统中,`.sh`和`.bash`文件均用于存储Shell脚本,但它们的核心区别在于**脚本的解释器兼容性**和**功能范围**。以下是详细对比: --- ### 1. **默认解释器不同** - **`.sh`文件** 通常以 `#!/bin/sh` 开头(Shebang行),使用系统默认的Bourne Shell解释器。 - 许多系统(如Ubuntu)的 `/bin/sh` 是`dash`(轻量级POSIX兼容Shell),而非Bash。 - 严格遵循POSIX标准,仅支持基础Shell功能。 - **`.bash`文件** 显式指定 `#!/bin/bash`,强制使用Bash解释器。 - 支持Bash扩展功能(如数组、高级条件判断、字符串操作等)。 --- ### 2. **语法兼容性差异** | 功能 | `.sh`(POSIX Shell) | `.bash`(Bash扩展) | |--------------------|----------------------|---------------------| | **数组** | ❌ 不支持 | ✅ 支持 | | **双括号条件** | ❌ 不支持 | ✅ 支持 `[[ ... ]]` | | **进程替换** | ❌ 不支持 | ✅ 支持 `<(cmd)` | | **正则表达式匹配** | ❌ 仅基础 | ✅ 支持 `=~` | **示例**:若脚本包含Bash特有语法(如数组),用 `sh script.sh` 运行会报错,必须用 `bash script.sh`。 --- ### 3. **执行方式的潜在影响** - **文件后缀不影响执行逻辑** 实际行为由**Shebang行**(首行 `#!...`)决定,而非后缀名。 - 若文件名为 `test.sh`,但Shebang是 `#!/bin/bash`,实际仍以Bash执行。 - **后缀的约定意义** - `.sh`:暗示脚本遵循POSIX标准,兼容性优先。 - `.bash`:明确依赖Bash扩展功能。 --- ### 4. **系统兼容性** - **`.sh`文件** - 通用性更强,可在所有Unix-like系统(包括BSD、macOS)运行。 - 若需兼容老旧环境(如嵌入式设备),优先使用`.sh`。 - **`.bash`文件** - 依赖Bash解释器,需确保目标系统已安装Bash(默认多数Linux有,但BSD/macOS需手动安装)。 --- ### 5. **验证解释器兼容性** - 检查系统默认的`sh`解释器: ```bash ls -l /bin/sh # 若显示链接到dashbash ``` - 测试脚本是否兼容POSIX: ```bash bash --posix script.sh # 强制以POSIX模式运行 ``` --- ### 使用建议 1. **优先使用`.sh`**:若脚本无需Bash扩展功能,保持兼容性。 2. **显式指定Shebang**:即使文件名为`.bash`,也建议首行写 `#!/bin/bash`。 3. **避免混用语法**:若用`.sh`后缀,需严格遵循POSIX标准(可通过工具 `shellcheck` 检查)。 --- **总结**:后缀名本身不限制功能,但`.sh`约定代表兼容性脚本,`.bash`明确依赖Bash特性。关键是通过Shebang行控制解释器行为。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值