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

sh与bash的区别

sh与bash的区别

结论:对于一般开发者,没有区别;对于要使脚本兼容较老系统,或者兼容其他shell(如ksh,dash),那么意义可能很重大,要确保自己代码没有bash扩展的特性。

区别

sh是早期版本,用POSIX标准,没有bash扩展的特性;bash是后期版本,有bash扩展的特性(默认模式、bash标准模式)。

bash扩展的特性

  • 数组支持
  • [[ 条件测试,提供了比 [ (POSIX test 命令) 更强大的条件测试结构,支持模式匹配、逻辑运算等。
  • function 关键字:Bash 允许使用 function 关键字定义函数。
  • local 关键字:可以在函数中定义局部变量,而 POSIX shell 不支持此特性。
  • 进程替换:支持使用 <(command)>(command) 进行进程替换。
  • shopt 命令:Bash 允许通过 shopt 来开启或关闭 shell 的某些特性。
  • 扩展的重定向:支持 |& 语法将标准输出和标准错误重定向到同一管道。
  • ** 递归通配符:支持使用 ** 来递归匹配文件和目录。
  • 字符串操作:Bash 提供了丰富的字符串处理功能,例如 ${var#pattern}${var/pattern/replacement} 等。
  • $RANDOM$PPID 等特殊变量:这些变量是 Bash 特有的,用于生成随机数、获取父进程 ID 等。
  • 内置算术表达式:支持 (( )) 进行算术运算,比 expr 更灵活。
  • Here字符串 (<<<):将字符串作为输入传递给命令。
  • 命令历史扩展:Bash 提供强大的命令历史记录功能,例如 !! 重复上一个命令,!n 执行第 n 个命令。
  • 别名(alias)支持:Bash 支持通过 alias 定义命令的别名。
  • 数组切片:Bash 提供数组的切片操作,用来获取数组的部分元素。

据(这篇文章)说,POSIX模式下,shell遇到错误会停止;默认模式shell遇到错误仍然进行;(这里说的错误是指运行时的返回的非0值,而不是指脚本中的语法错误。)
然而,这个说法是有问题的。

理论上,POSIX模式下,不支持bash扩展特性,实际上不是

确定sh或bash的真实指向

以sh为例

  1. 确定sh的真实路径,which sh,一般是/usr/bin/sh
  2. 查看sh的指向,ll /usr/bin/sh,得到lrwxrwxrwx. ........ /usr/bin/sh -> bash。这里看到lrwx..... ->bash,所以/usr/bin/sh是一个软链接,指向bash。
    尽管sh指向bash,但通过sh执行脚本,仍然会启用POSIX模式。

脚本解释器(sh或bash)的优先级

执行脚本的命令sh 或 bash >优先于 脚本头定义的【shebang】 >优先于 系统默认的shell。

若,通过sh 或 bash调用脚本,解释器为sh 或 bash;
若,通过相对路径、绝对路径调用脚本,解释器由脚本头的【shebang】决定;
若,通过路径调用脚本,脚本头也没有【shebang】,则由系统默认的shell决定;

结论:区别不大,对于普通开发者来说

  1. 不论是不是POSIX模式,不论脚本头如何写(#!/bin/sh或 #!/bin/bash),不论用sh 或 bash 或 路径调用法,不论加不加--posix参数脚本中的数组与[[]]都支持。即,bash扩展特性都支持。
  2. shell遇到错误是否继续执行,与POSIX模式无关,但与set -e选项有关,默认set -e是关闭的,遇到错误仍然继续。这里的错误,是指脚本运行时抛出的非0返回值,而不是指脚本中的语法错误,语法错误都会造成脚本停止。
  3. 可以通过 if [ -o posix ]来区分POSIX模式,但在bash扩展特性都支持的情况下,没有太大意义;

为什么?

chatgpt给出的原因是,POSIX模式(POSIX兼容模式)与POSIX标准不一样,POSIX兼容模式会让bash尽量符合POSIX标准,但不会完全禁用所有的bash扩展。

区分还有意义吗?

有。当你需要编写一个兼容老系统的脚本,或者要在其他非bash的shell(ksh,dash)上运行的脚本,需要注意不要有bash扩展特性。

其他:执行shell的5种方式

参考

  1. 绝对路径、相对路径法,./test.sh
  2. sh、bash法,sh test.sh
  3. source或【.】法,source test.sh 或 . test.sh

如何查看sh的路径?

which - shows the full path of (shell) commands.

shell头的写法

#!/bin/bash
#!/bin/sh
名称叫做【shebang】,因为#发音是sharp,!发音是bang。它指定了shell的解释器。

相关文章:

sh与bash的区别

sh与bash的区别 结论&#xff1a;对于一般开发者&#xff0c;没有区别&#xff1b;对于要使脚本兼容较老系统&#xff0c;或者兼容其他shell&#xff08;如ksh&#xff0c;dash&#xff09;&#xff0c;那么意义可能很重大&#xff0c;要确保自己代码没有bash扩展的特性。 区…...

D48【python 接口自动化学习】- python基础之类

day48 练习&#xff1a;开发自动咖啡&#xff08;上&#xff09; 学习日期&#xff1a;20241025 学习目标&#xff1a;类 -- 62 小试牛刀&#xff1a;如何开发自动咖啡机&#xff1f;&#xff08;上&#xff09; 学习笔记&#xff1a; 案例解析 定义类 定义属性和方法 clas…...

PostgreSQL(WINDOWS)下载、安装、简单使用

下载 PostgreSQL: Downloads PostgreSQL: Windows installers EDB: Open-Source, Enterprise Postgres Database Management 安装 注意密码要方便自己使用&#xff0c;不能忘记。 打开pgAdmin&#xff0c;输入密码 新建数据库 打开命令工具 新建表...

Git的初次使用

一、下载git 找淘宝的镜像去下载比较快 点击这里 二、配置git 1.打开git命令框 2.设置配置 git config --global user.name "你的用名"git config --global user.email "你的邮箱qq.com" 3.制作本地仓库 新建一个文件夹即可&#xff0c;然后在文件夹…...

rocketmq服务的docker启动和配置

rocketmq的默认启动参数占用的内存实在是太大了&#xff0c;小于8G的电脑无法启动&#xff0c;docker中的开发环境又不可能用这么大&#xff0c;通用的该法是改sh文件 修改文件如下 runbroker.sh 默认8G JAVA_OPT"${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn…...

BLE和经典蓝牙相比,有什么优缺点

蓝牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;简称 BLE&#xff09;和经典蓝牙&#xff08;Bluetooth Classic&#xff0c;即 BR/EDR&#xff0c;Basic Rate/Enhanced Data Rate&#xff09;是蓝牙技术的两种主要模式。两者都有各自的优缺点&#xff0c;具体如下&am…...

ECharts图表图例知识点小结

ECharts 图表图例简述 一、知识点 1. 作用&#xff1a; - 用于标识图表中的不同系列&#xff0c;帮助用户理解图表所展示的数据内容。 2. 位置&#xff1a; - 可以通过配置项设置图例的位置&#xff0c;如 top 、 bottom 、 left 、 right 等。 3. 显示状态控制&#xff1a…...

LabVIEW非接触式模态参数识别系统开发

基于LabVIEW的模态参数识别系统采用非接触式声学方法&#xff0c;结合LabVIEW软件和高精度硬件&#xff0c;实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛&#xff0c;提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法&#xff0c;如锤击法&#x…...

厨艺爱好者的在线家园:基于Spring Boot的实现

1 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时间变得更加地宝贵化&#xff0c;因为每天的…...

PostgreSQL使用clickhouse_fdw访问ClickHouse

Postgres postgres版本&#xff1a;16&#xff08;测试可用&#xff09;docker 安装 插件安装 clickhouse_fdw: https://github.com/ildus/clickhouse_fdw 安装命令 git clone gitgithub.com:ildus/clickhouse_fdw.git cd clickhouse_fdw mkdir build && cd build…...

docker 单节点arm架构服务器安装zookeeper、kafka并测试通信

kafka、zookeeper常用镜像介绍 kafka和zookeeper常见的镜像有以下三个&#xff1a;wurstmeister/zookeeper、kafka、confluentinc/cp-zookeeper、cp-kafka 和 bitnami/zookeeper、kafka。 wurstmeister/xxx: 由wurstmeister团队维护&#xff0c;提供的镜像适用于开发和测试环…...

AnaTraf | 全面掌握网络健康状态:全流量的分布式网络性能监测系统

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具AnaTraf网络流量分析仪是一款基于全流量&#xff0c;能够实时监控网络流量和历史流量回溯分析的网络性能监控与诊断系统&#xff08;NPMD&#xff09;。通过对网络各个关键节点的监测&#xff0c;收集网络性能…...

单片机入门教程

单片机入门教程 单片机是一种将中央处理器&#xff08;CPU&#xff09;、存储器、输入输出接口等集成在一个芯片上的微型计算机系统。本教程将带你从零开始学习如何使用一款常见的单片机——ATmega328P&#xff0c;并编写简单的控制程序。 1. 单片机简介 1.1 什么是单片机&a…...

三维管线管网建模工具MagicPipe3D V3.5.3

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网三维模型&#xff08;包括管道、接头、附属设施等&#xff09;&#xff0c;输出标准3DTiles、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析&…...

(二十三)、k8s(minikube) 部署mysql

文章目录 1、安装1.1、环境1.2、workbench 崩溃问题1.1、deployment.yaml 文件1.2、运行1.3、启动隧道&#xff0c;从宿主机直接访问 k8s 中的mysql 2、完整卸载 mysql&#xff08;pod/deployment/service/pvc&#xff09; 1、安装 1.1、环境 docker 部署 minikube,minikube …...

FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频

FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频 文章目录 FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频1、前言1.1 目标1.2 一些说明 2、效果3、代码3.1 思路3.2 工程目录3.3 核心代码 4、全部代码获取 1、前言 本文通过FFMPEG(7.0.2)与Qt(5.13.…...

微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件

要在微信小程序中关闭默认的 navigationBar&#xff0c;并使用自定义的 nav-bar 组件&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 关闭默认的 navigationBar 在你的页面的配置文件 *.json 中设置 navigationBar 为 false。你需要在页面的 JSON 配置文件中添加以下代码…...

FPGA 小鸟避障游戏

FPGA实现效果&#xff1a; FPGA 小鸟避障游戏 FPGA&#xff08;Field Programmable Gate Array&#xff09;即现场可编程门阵列&#xff0c;是一种可以编程的数字逻辑器件。基于FPGA的小鸟避障游戏是一种结合了硬件加速和算法优化来运行的实时交互游戏。这种游戏一般利用FPGA的…...

Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…...

django5入门【03】新建一个hello界面

文章目录 1、前提条件⭐2、操作步骤总结3、实际操作示例 1、前提条件⭐ 将上一节创建的 Django 项目导入到 PyCharm 中。 2、操作步骤总结 &#xff08;1&#xff09;在 HelloDjango/HelloDjango 目录下&#xff0c;新建一个 views.py 文件。 &#xff08;2&#xff09;在 H…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...