当前位置: 首页 > news >正文

bash和sh区别

`bash` 和 `sh` 是两种常用的 Unix Shell,它们有一些区别,特别是在功能和兼容性方面。以下是一些主要的区别:

1. **历史与实现**:
   - `sh`(Bourne Shell)是第一个 Unix Shell,最初由 Stephen Bourne 在 1977 年开发。它是 POSIX 标准的一部分。
   - `bash`(Bourne Again Shell)是 `sh` 的增强版本,由 GNU 项目在 1989 年开发。它是 Linux 系统中默认的 Shell,包含了许多扩展和改进。

2. **功能**:
   - `bash` 支持更多的功能,如更强大的脚本编写能力、更好的用户界面和命令行编辑功能。
   - `bash` 支持命令别名、数组、进程替换、扩展的变量替换和更多的内置命令。
   - `sh` 是一个更简单、更基本的 Shell,不支持 `bash` 的所有特性。

3. **兼容性**:
   - `sh` 通常是指 POSIX `sh`,它是一个标准 Shell,在几乎所有 Unix 系统上都可以找到。编写的脚本可以在任何支持 POSIX 的系统上运行。
   - `bash` 向后兼容 `sh`,这意味着大多数 `sh` 脚本在 `bash` 下都可以运行,但反之则不一定成立,因为 `bash` 脚本可能使用 `sh` 不支持的扩展功能。

4. **语法和特性**:
   - `bash` 提供了许多 `sh` 所不具备的特性,例如 `[[ ... ]]` 条件测试、`<<<` Here Strings、`$RANDOM` 和 `$SECONDS` 变量、`<()` 和 `>()` 进程替换等。
   - `bash` 支持更复杂的循环和条件语句,更强大的字符串操作,更灵活的输入输出重定向。

5. **默认 Shell**:
   - 在许多 Linux 发行版中,`/bin/sh` 是一个指向 `bash` 的符号链接,这意味着在这些系统上运行 `sh` 实际上会启动 `bash` 的兼容模式。
   - 在一些其他系统上,如 Solaris 和某些 BSD 系统,`/bin/sh` 可能是 `ksh`(Korn Shell)或 `dash`(一种更轻量级、更快速的 `sh` 实现)。

**具体例子**:
以下是一些具体的脚本片段,展示了 `bash` 和 `sh` 的一些不同特性:

1. **数组支持**(仅 `bash` 支持):
   ```bash
   #!/bin/bash
   arr=(1 2 3 4 5)
   echo ${arr[0]}  # 输出 1
   ```

2. **字符串操作**:
   ```bash
   #!/bin/bash
   string="hello world"
   echo ${string:6:5}  # 输出 world
   ```

3. **进程替换**(仅 `bash` 支持):
   ```bash
   #!/bin/bash
   diff <(ls dir1) <(ls dir2)
   ```

**执行脚本的区别**:
- 使用 `bash` 执行脚本:
  ```bash
  bash script.sh
  ```

- 使用 `sh` 执行脚本:
  ```bash
  sh script.sh
  ```

当你使用 `bash` 执行脚本时,可以利用 `bash` 的所有特性。而使用 `sh` 执行脚本时,脚本应当遵循 POSIX `sh` 的限制。

总结来说,如果你需要使用 `bash` 的特性,请确保在脚本头部声明 `#!/bin/bash`,并且使用 `bash` 来执行脚本。否则,为了更好的兼容性,你可以使用 `sh`。

http://www.lryc.cn/news/372743.html

相关文章:

  • Git 代码管理规范 !
  • MGRS坐标
  • FreeRTOS简单内核实现4 临界段
  • Scala的字符串插值
  • EasyGBS服务器和终端配置
  • git配置2-不同的代码托管平台配置不同的ssh key
  • 【CT】LeetCode手撕—102. 二叉树的层序遍历
  • Flink 命令行提交、展示和取消作业
  • STM32单片机选型方法
  • gsap动画库的实践
  • LeetCode | 387.字符串中的第一个唯一字符
  • textarea 中的内容在word中显示换行不起作用
  • Python 测试用例
  • 树莓派等Linux开发板上使用 SSD1306 OLED 屏幕,bullseye系统 ubuntu,debian
  • SpringBoot3 整合 Mybatis 完整版
  • 图解Transformer学习笔记
  • 【Java并发编程之美 | 第一篇】并发编程线程基础
  • 基于python-CNN卷积网络训练识别牛油果和猕猴桃-含数据集+pyqt界面
  • 论文笔记:ATime-Aware Trajectory Embedding Model for Next-Location Recommendation
  • 深度学习之---迁移学习
  • 百度网盘限速解决办法
  • 银河麒麟系统项目部署
  • Stable Diffusion【应用篇】【艺术写真】:粘土风之后陶瓷风登场,来看看如何整合AI艺术写真吧
  • 手机IP地址距离多远会变:解析移动设备的网络定位奥秘
  • ChatGPT中文镜像网站分享
  • 碳化硅陶瓷膜良好的性能
  • 每日一题——Python实现PAT乙级1028 人口普查 Keyboard(举一反三+思想解读+逐步优化)六千字好文
  • 小程序 UI 风格,构建美妙视觉
  • 使用Python在VMware虚拟机中模拟Ubuntu服务器搭建网站
  • 腾讯测试开发<ieg 实验室>