sh与bash:Shell脚本中的微妙差异

在Unix和Linux的世界中,Shell是用户与操作系统交互的主要界面。Shell提供了命令行界面,使得用户能够执行各种命令和操作。在众多的Shell中,sh和bash是最常见且使用最广泛的两种。尽管它们在很多方面相似,但在功能、特性和语法上,它们之间仍存在一些微妙的差异。

一、起源与发展

sh,即Bourne Shell,是最早的Unix Shell之一,由Stephen Bourne在AT&T的Bell Labs开发。它提供了基本的命令行解释和脚本执行功能。而bash,即Bourne Again SHell,是sh的一个替代品,由Brian Fox为GNU项目创建。bash在sh的基础上增加了很多新的特性和功能,使得它更加灵活和强大。

二、语法与特性

  1. 命令替换:在sh中,命令替换通常使用反引号()来实现,如command`。而在bash中,除了反引号,还可以使用$(command)的形式进行命令替换。bash的这种形式更加直观,也更容易嵌套。

  2. 数组:bash支持一维数组,而sh则不支持。这使得bash在处理复杂数据结构时更加灵活。

  3. 函数:bash支持用户定义的函数,而sh则不支持。函数使得脚本能够更好地组织代码,提高可读性和可维护性。

  4. 命令历史:bash提供了命令历史功能,用户可以方便地查看、编辑和执行之前执行过的命令。而sh则没有这一功能。

  5. 文件名通配符扩展:bash提供了更强大的文件名通配符扩展功能,支持更多的模式匹配选项。

  6. 进程控制:bash提供了更多的进程控制选项,如作业控制、后台执行等。

三、性能与兼容性

由于bash在sh的基础上增加了许多新的特性和功能,因此在某些情况下,bash可能会比sh消耗更多的系统资源。然而,随着计算机硬件的发展,这种差异对于大多数用户来说已经不再明显。

在兼容性方面,bash尽可能地保持了与sh的兼容性。大多数在sh中有效的脚本在bash中也能正常运行。但是,由于bash增加了一些新的语法和特性,一些在bash中编写的脚本可能在sh中无法正确执行。

四、使用场景

由于sh是较早的Shell,因此在一些老旧的Unix系统或者嵌入式系统中,可能只支持sh。而在现代的Linux系统中,bash已经成为了默认的Shell。对于大多数用户来说,bash提供了更多的功能和更好的用户体验,因此是更好的选择。

五、总结

sh和bash都是Unix和Linux系统中常见的Shell,它们在功能、特性和语法上存在一些差异。bash作为sh的替代品,提供了更多的功能和更好的用户体验。然而,由于sh在一些老旧系统中的存在,了解它们之间的差异对于跨平台脚本编写和系统管理来说是非常重要的。在选择使用哪种Shell时,需要根据具体的需求和系统环境来做出决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置交换机 SSH 管理和端口安全——实验1:配置交换机基本安全和 SSH管理

实验目的 通过本实验可以掌握: 交换机基本安全配置。SSH 的工作原理和 SSH服务端和客户端的配置。 实验拓扑 交换机基本安全和 SSH管理实验拓扑如图所示。 交换机基本安全和 SSH管理实验拓扑 实验步骤 (1)配置交换机S1 Switch>enab…

【r-tree算法】一篇文章讲透~

目录 一、引言 二、R-tree算法的基本原理 1 数据结构 2 插入操作 3 删除操作 4 查询操作 5 代码事例 三、R-tree算法的性能分析 1 时间复杂度 2 空间复杂度 3 影响因素 四、R-tree算法的变体和改进 1 R*-tree算法 2 X-tree算法 3 QR-tree算法 五、R-tree算法的…

深度优先搜索算法C实现

深度优先搜索 (DFS, Depth-First Search) 是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当达到树的末端时,它会回溯到树的前一个节点,直到找到未探索的路径。 下面是一个简单的深度优先搜索的C语言实现,这个实现是在一个无向图中进行的。在这个例…

Hive某字段空值用同组该字段非空值填充

背景: 工作中遇到这样一个业务场景:系统中记录订单提报和订单审核通过两个时间点某业务状态,开发做标记时一个订单产生了两条记录,即提报时记录状态1字段,状态2字段为空;审核通过时产生新纪录记录状态2字段…

axure谷歌插件(直接下载)

axure谷歌插件 在网上找一个谷歌的axure,不是登陆就是收费,离谱。找了好久才找到这个,我下载保存到网盘了,直接下载就ok,永久无提取码。 下载插件文件,打开开发者模式,直接拖进来就ok。 网盘…

esxi上给centos7虚拟机扩容硬盘

原来centos7硬盘分配的空间只有40GB 需要直接扩容到200GB 扩容前 扩容后 扩容步骤: 1 .在esxi平台上关机虚拟机,将硬盘调整为200GB,然后开机 2.请出chatGPT 1. 创建新分区 使用剩余的磁盘空间创建一个新的分区。你可以使用fdisk&#xf…

Flink Keyed State的优化与实践

本期作者 1.背景 Flink SQL在业务使用中有较多的双流join场景,当左右流的流量都较大,Join的等待时间即使为1小时,Flink Keyed State(Flink State分Operator State和Keyed State,后文所有State均代表后者)的…

opencv识别图形轮廓并计算面积以及在输出图片上显示中文字体

前言 opencv识别带有轮廓的图形,主要是常见数学图形如方形、圆形以及不规则图形,并计算其面积(像素统计)。 配置: 平台:windows 工具:visual studio code 语言:python 库:opencv、Pillow 一、图形识别与计算 opencv处理图形轮廓的步骤如下: 1、将图片转为灰度图:…

数据库(mysql)-基本查询语句(DQL)

查询语句 这边查询是给予一定表格,这边先做个解释 教师表包括(name(姓名),gender(性别),salary(工资),title(职位),subject_id(课程的编号),comm(奖金)) 学生表包括(姓名(name),gender(性别),job(职位),生日(birth)) 模版 SELECT 字段名 FROM 查询表 WHERE 查询语句 或与非…

k8s_入门_命令详解

命令详解 kubectl是官方的CLI命令行工具,用于与 apiserver进行通信,将用户在命令行输入的命令,组织并转化为 apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径 1. 帮助 2. 查看版本信息 3. 查看资源对象等 查看No…

Linux应用开发(3):Linux时间操作(time、mktime、localtime等)

1. 简述 在Linux系统中,时间操作函数是编程中经常使用的一部分,它们允许程序获取和设置系统时间,以及对时间进行各种处理。以下是一些常用的时间操作函数的详细介绍。 2. 时间操作 (1)time(): 获取1970年1月1日以来的…

Docker使用报错信息dial unix /var/run/docker.sock: connect: permission denied

报错信息dial unix /var/run/docker.sock: connect: permission denied masterlocalhost:~$ docker ps Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/container…

爬虫入门教程(一)

爬虫入门教程 1.什么是爬虫 爬虫是一种自动获取网站数据的程序或脚本。它可以自动模拟人类访问网站,获取网页源代码,解析并提取出所需的数据。 爬虫的工作原理类似于搜索引擎的索引程序,它们会按照预定的规则和算法在互联网上不断地爬取网页,收集信息…

二维相位解包裹理论算法和软件【全文翻译-掩膜切割算法(4.4)】

4.4 掩膜切割算法 在上一节中,我们了解到质量引导路径跟踪算法可以解决一些相位解包问题,而在这些问题上,戈尔茨坦算法会因为分支切割的错位而失败。这是因为质量引导方法采用了更多的信息(质量图)来引导解包路径。在本节中,我们将这一想法与戈尔茨坦算法相结合,产生了…

k8s知识

k8s是用于容器编排和管理的,docker或者ctr是k8s的运行时,k8s通过容器运行时来启动容器,容器启动需要镜像,镜像可以用docker构建,dockerfile就是用于自定义如何构建镜像,所以上面那套流水线就是先用dockerfi…

iperf3使用记录

安装 大部分系统标配工具: yum install -y iperf3参数 常用的参数如下,其他参数请-h Server or Client:-p, --port # server port to listen on/connect to-f, --format [kmgtKMGT] format to report: Kbits, Mbits, Gbits, Tbits-i,…

【Android】java中如何判断设备是否在root状态

前言 客户需求,需要判断设备是否执在root状态。可以理解为是否执行了adb root 设置root状态,已经adb unroot设置unroot状态。 代码分析 分析adb deamon发现:在执行adb root 、adb unroot指令时,系统会更新service.adb.root 变量…

Linux|从 STDIN 读取 Awk 输入

简介 在之前关于 Awk 工具的系列文章中,主要探讨了如何从文件中读取数据。但如果你希望从标准输入(STDIN)中读取数据,又该如何操作呢? 在本文中,将介绍几个示例,展示如何使用 Awk 来过滤其他命令…

即插即用篇 | YOLOv8引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

本改进已集成到 YOLOv8-Magic 框架。 下采样操作如最大池化或步幅卷积在卷积神经网络(CNNs)中被广泛应用,用于聚合局部特征、扩大感受野并减少计算负担。然而,对于语义分割任务,对局部邻域的特征进行池化可能导致重要的空间信息丢失,这有助于逐像素预测。为了解决这个问题…

mysql 查询变量@i:=@i+1

学习完mysql的查询:基本查询,连接查询和子查询和mysql 正则表达式查询,接下来先学习下变量查询。 mysql中没有oracle序列号那一列。mysql可以使用查询变量的方式去处理。我们先了解下查询变量,后面应用起来就更清晰。 1&#xff0…