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

相关文章:

bash和sh区别

bash 和 sh 是两种常用的 Unix Shell&#xff0c;它们有一些区别&#xff0c;特别是在功能和兼容性方面。以下是一些主要的区别&#xff1a; 1. **历史与实现**&#xff1a; - sh&#xff08;Bourne Shell&#xff09;是第一个 Unix Shell&#xff0c;最初由 Stephen Bourn…...

Git 代码管理规范 !

分支命名 master 分支 master 为主分支&#xff0c;也是用于部署生产环境的分支&#xff0c;需要确保master分支稳定性。master 分支一般由 release 以及 hotfix 分支合并&#xff0c;任何时间都不能直接修改代码。 develop 分支 develop 为开发环境分支&#xff0c;始终保持最…...

MGRS坐标

一 概述 MGRS坐标系统&#xff0c;即军事格网参考系统&#xff0c;是北约(NATO)军事组织使用的标准坐标系统。它基于UTM&#xff08;通用横向墨卡托&#xff09;系统&#xff0c;并将每个UTM区域进一步划分为100km100km的小方块。这些方块通过两个相连的字母标识&#xff0c;其…...

FreeRTOS简单内核实现4 临界段

文章目录 0、思考与回答0.1、思考一0.2、思考二0.3、思考三 1、关中断1.1、带返回值1.2、不带返回值 2、开中断3、临界段4、应用 0、思考与回答 0.1、思考一 为什么需要临界段&#xff1f; 有时候我们需要部分代码一旦这开始执行&#xff0c;则不允许任何中断打断&#xff0…...

Scala的字符串插值

Scala的字符串插值 期待您的关注 ☀Scala学习笔记 目录 Scala的字符串插值 1. s插值器&#xff1a; 2. f插值器&#xff1a; 3. raw插值器&#xff1a; 在Scala中&#xff0c;字符串插值是一种方便的方式&#xff0c;可以在字符串中插入变量或表达式的值。Scala支持三种类型…...

EasyGBS服务器和终端配置

服务器配置 修改easygbs.ini sip/host为本机IP&#xff0c;否则终端能登录&#xff0c;无法视频。 [sip] host192.168.3.190 终端用于登录的用户名和密码 default_usertest default_passwordtest1234 default_guest_userguest default_guest_passwordtest1234终端配置 关…...

git配置2-不同的代码托管平台配置不同的ssh key

1. 配置单个ssh key 1.1. 原理1.2. 生成 ssh key1.3. 代码托管平台配置公钥 2. 配置多个ssh key 2.1. 应用场景2.2. 生成两个不同的key2.3. 修改config文件2.4. 配置代码托管平台2.5. 测试是否成功 1. 配置单个ssh key 1.1. 原理 使用ssh命令行工具&#xff08;git安装成功…...

【CT】LeetCode手撕—102. 二叉树的层序遍历

目录 题目1-思路2- 实现⭐102. 二叉树的层序遍历——题解思路 3- ACM实现3-1 二叉树构造3-2 整体实现 题目 原题连接&#xff1a;102. 二叉树的层序遍历 1-思路 1.借助队列 Queue &#xff0c;每次利用 ①while 循环遍历当前层结点&#xff0c;②将当前层结点的下层结点放入 …...

Flink 命令行提交、展示和取消作业

Apache Flink 是一个流处理和批处理的开源框架&#xff0c;用于在分布式环境中执行无边界和有边界的数据流。你可以使用 Flink 的命令行界面&#xff08;CLI&#xff09;来提交、展示和取消作业。 提交作业 使用 Flink CLI 提交作业的命令格式通常如下&#xff1a; ./bin/fl…...

STM32单片机选型方法

一.STM32单片机选型方法 1.首先要确定需求&#xff1a; 性能需求&#xff1a;根据应用的复杂度和性能要求&#xff0c;选择合适的CPU性能和主频。 内存需求&#xff1a;确定所需的内存大小&#xff0c;包括RAM和Flash存储空间。 外设需求&#xff1a;根据应用所需的功能&…...

gsap动画库的实践

先看效果&#xff1a; gsap动画库 安装插件&#xff1a;npm install gsap <template><div><h1 style"text-align: left">gsap的用法</h1><h1 style"text-align: left">https://gsap.com/resources/get-started</h1>&…...

LeetCode | 387.字符串中的第一个唯一字符

这道题可以用字典解决&#xff0c;只需要2次遍历字符串&#xff0c;第一次遍历字符串&#xff0c;记录每个字符出现的次数&#xff0c;第二次返回第一个出现次数为1的字符的下标&#xff0c;若找不到则返回-1 class Solution(object):def firstUniqChar(self, s):""…...

textarea 中的内容在word中显示换行不起作用

js文本换行在word显示 在JavaScript中&#xff0c;处理文本换行以确保它在Word中正确显示&#xff0c;通常需要将文本中的换行符转换为Word可识别的格式。在HTML中&#xff0c;换行通常是通过<br>标签来实现的&#xff0c;而在Word中&#xff0c;换行通常由段落标签<…...

Python 测试用例

在Python中编写测试用例通常使用unittest模块&#xff0c;这是Python标准库的一部分&#xff0c;专门用于编写和运行测试。下面是一个简单的测试用例的例子&#xff0c;展示了如何使用unittest模块来测试一个函数。 假设我们有一个简单的函数&#xff0c;用于计算两个数的和&a…...

树莓派等Linux开发板上使用 SSD1306 OLED 屏幕,bullseye系统 ubuntu,debian

Raspberry Pi OS Bullseye 最近发布了,随之而来的是许多改进,但其中大部分都在引擎盖下。没有那么多视觉差异,最明显的可能是新的默认桌面背景,现在是大坝或湖泊上的日落。https://www.the-diy-life.com/add-an-oled-stats-display-to-raspberry-pi-os-bullseye/ 通过这次操…...

SpringBoot3 整合 Mybatis 完整版

本文记录一下完整的 SpringBoot3 整合 Mybatis 的步骤。 只要按照本步骤来操作&#xff0c;整合完成后就可以正常使用。1. 添加数据库驱动依赖 以 MySQL 为例。 当不指定 依赖版本的时候&#xff0c;会 由 springboot 自动管理。 <dependency><groupId>com.mysql&l…...

图解Transformer学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Transformer Attention为RNN带来了优点&#xff0c;那么有没有一种神经网络结构直接基于Attention构造&#xff0c;而不再依赖RNN、LSTM或者CNN的结构&#xff0c;这就是Trans…...

【Java并发编程之美 | 第一篇】并发编程线程基础

文章目录 1.并发编程线程基础1.1什么是线程和进程&#xff1f;1.2线程创建与运行1.2.1继承Thread类1.2.2实现Runnable接口1.2.3实现Callable接口&#xff08;与线程池搭配使用&#xff09;1.2.4小结 1.3线程常用方法1.3.1线程等待与通知1.3.2线程睡眠1.3.3让出CPU执行权1.3.4线…...

基于python-CNN卷积网络训练识别牛油果和猕猴桃-含数据集+pyqt界面

代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89383066 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文…...

论文笔记:ATime-Aware Trajectory Embedding Model for Next-Location Recommendation

Knowledge and Information Systems, 2018 1 intro 1.1 背景 随着基于位置的社交网络&#xff08;LBSNs&#xff09;&#xff0c;如Foursquare和Facebook Places的日益流行&#xff0c;大量用户签到数据变得可用 这些大量签到数据的可用性带来了许多有用的应用&#xff0c;以…...

faster-whisper-GUI架构设计与性能优化:构建高效语音识别工作流的技术实践

faster-whisper-GUI架构设计与性能优化&#xff1a;构建高效语音识别工作流的技术实践 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 在语音识别技术快速发展的今天&#xff0…...

别再手动点灯了!用Simulink串口实时控制STM32,5分钟搞定双向通信

基于Simulink与STM32的实时双向通信实战指南 在嵌入式系统开发中&#xff0c;快速原型验证是提升效率的关键环节。传统开发模式下&#xff0c;工程师需要花费大量时间编写底层通信协议、调试硬件接口&#xff0c;而真正核心的控制算法验证反而被边缘化。本文将介绍一种高效开发…...

OpenCV实战:图像亮度、对比度与锐化的智能调节与优化

1. 图像处理基础概念解析 在开始动手实践之前&#xff0c;我们需要先理解几个关键概念。亮度、对比度和锐化这三个参数就像调节电视画面的三个旋钮&#xff0c;每个旋钮都会对图像产生独特的影响。 亮度&#xff08;Brightness&#xff09;就像房间里的灯光开关。调高亮度&…...

电价狂降、负值频现!2026电力现货市场惊变,出清电价底层逻辑全拆解

当“0电价”甚至“负电价”成为常态&#xff0c;电力行业的盈利逻辑正在被彻底颠覆。2026年的春天&#xff0c;电力行业迎来了一场前所未有的“地震”。就在刚刚过去的一季度&#xff0c;辽宁电力现货市场全天均价首次跌入负值区间&#xff0c;1月1日至25日短短25天内&#xff…...

Navicat数据库自动备份实战:如何设置定时任务避免数据丢失

Navicat数据库自动备份实战&#xff1a;如何设置定时任务避免数据丢失 数据是现代企业的核心资产&#xff0c;一次意外的数据丢失可能造成难以估量的损失。作为数据库管理工具中的佼佼者&#xff0c;Navicat提供了强大的自动备份功能&#xff0c;能够帮助中小企业和个人开发者建…...

如何在5分钟内开始使用Ivy Wallet:新手入门教程

如何在5分钟内开始使用Ivy Wallet&#xff1a;新手入门教程 【免费下载链接】ivy-wallet Ivy Wallet is an open-source money manager app for android that you can either build or download from Google Play. 项目地址: https://gitcode.com/gh_mirrors/iv/ivy-wallet …...

如何快速实现Tale博客系统国际化:多语言博客搭建完整指南

如何快速实现Tale博客系统国际化&#xff1a;多语言博客搭建完整指南 【免费下载链接】tale &#x1f984; Best beautiful java blog, worth a try 项目地址: https://gitcode.com/gh_mirrors/ta/tale Tale博客系统是一款优雅的Java博客程序&#xff0c;提供了强大的内…...

Pixel Aurora Engine镜像部署:多用户并发生成的Streamlit服务配置

Pixel Aurora Engine镜像部署&#xff1a;多用户并发生成的Streamlit服务配置 1. 像素极光引擎简介 Pixel Aurora&#xff08;像素极光&#xff09;是一款基于AI扩散模型的高端绘图工作站&#xff0c;采用独特的复古像素游戏风格界面设计。这款工具能够将文字描述转化为极具视…...

AI赋能开发:让快马平台智能理解并生成产区标准图交互应用

AI赋能开发&#xff1a;让快马平台智能理解并生成产区标准图交互应用 最近在做一个农产品产区标准查询系统的项目&#xff0c;发现用传统方式开发这类需求特别费时。比如要处理用户自然语言查询、动态生成地图、实现智能推荐逻辑&#xff0c;光写基础代码就得花好几天。后来尝…...

赋能音乐自由:Unlock Music技术解密与全场景应用指南

赋能音乐自由&#xff1a;Unlock Music技术解密与全场景应用指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https:…...