当前位置: 首页 > 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`。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 牛客网刷题 | BC118 N个数之和
  • vue学习(一)
  • 代理模式(设计模式)
  • 【机器学习】集成学习方法:Bagging与Boosting的应用与优势
  • 安全测试框架
  • 怎么修改Visual Studio Code中现在github账号
  • HCIA 16 构建 IPv6 网络基础配置
  • Llama模型家族之拒绝抽样(Rejection Sampling)(九) 强化学习之Rejection Sampling
  • YOLOv8可视化界面PYQT5
  • 【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
  • HTTP文件下载
  • Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例
  • 从零开始开发知识付费APP:在线教育系统源码详解
  • Renesas MCU之FreeRTOS的应用
  • Java 开发实例:Spring Boot+AOP+注解+Redis防重复提交(防抖)
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [deviceone开发]-do_Webview的基本示例
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JSDuck 与 AngularJS 融合技巧
  • Kibana配置logstash,报表一体化
  • Mysql优化
  • Nacos系列:Nacos的Java SDK使用
  • SQLServer之索引简介
  • Vue学习第二天
  • 对象管理器(defineProperty)学习笔记
  • 机器学习中为什么要做归一化normalization
  • 蓝海存储开关机注意事项总结
  • 码农张的Bug人生 - 见面之礼
  • 区块链技术特点之去中心化特性
  • 软件开发学习的5大技巧,你知道吗?
  • 使用 @font-face
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 试着探索高并发下的系统架构面貌
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​Spring Boot 分片上传文件
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​第20课 在Android Native开发中加入新的C++类
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #1014 : Trie树
  • #LLM入门|Prompt#3.3_存储_Memory
  • #pragma预处理命令
  • #考研#计算机文化知识1(局域网及网络互联)
  • ( 10 )MySQL中的外键
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Note)C++中的继承方式
  • (PADS学习)第二章:原理图绘制 第一部分
  • (搬运以学习)flask 上下文的实现