shell编程系列- bash和sh的区别

文章目录

  • 引言
  • bash和sh的区别
    • CentOS下的区别
    • Ubuntu下的区别
  • 最佳实践

引言

我们在编写shell脚本时,通常第一行都要声明当前脚本的执行程序,也就是常见的 #!/bin/sh 或者是 #!/bin/bash ,我们无论用哪一个脚本似乎都可以正常的执行,那具体有什么区别呢,我们接下来会详细的讲一下。

bash和sh的区别

在大多数的Linux系统里, #!/bin/sh#!/bin/bash 其实就是完全相同的,但是在另外一些Linux系统中两者还是存在不小的区别,这主要是因为Linux系统发展的历史原因导致的,因为Linux操作系统在最近几十年的发展中,逐步分化为不同的发行版,在Redhat和CentOS里两者是相同的,但是在Ubuntu和Debian系统中两者有区别。

CentOS下的区别

首先我们一起看一下CentOS中两者区别,如下图:
在这里插入图片描述
可以看到 /bin/sh 是一个软连接(可以简单的理解为window里的快捷方式)指向了/bin/bash 所以两者本身就是同一个shell,没有任何区别

Ubuntu下的区别

我们在一起看看Ubuntu中两者的区别,如下图:
在这里插入图片描述
可以看到 /bin/sh 通过软连接指向了dash 这是Ubuntu提供的一个轻量级的shell,他比bash shell要少一些特性,所以在Ubuntu的系统中,如果我们使用#!/bin/sh来解释执行我们的脚本,可能就会出现一个诡异的问题。
我举个例子,有如下脚本:
在这里插入图片描述

脚本的内容很简单就是声明一个数组,然后遍历打印,注意我们此时用的是 #!/bin/sh ,我们执行一下看看结果,报错了如下图:
在这里插入图片描述
报错的原因是语法错误,这是因为在dash shell中不允许我们直接定义数组。
但是如果我们换为bash shell来解释执行脚本,我们可以看一下效果,脚本内容如下:
在这里插入图片描述
脚本可以正常执行,如下图:
在这里插入图片描述

最佳实践

先说结论,shell脚本中建议使用 #!/bin/bash
上面讲了两种shell的区别,我们可以发现使用bash shell 其实可以避免一些诡异的问题,并且bash shell 也是所有linux发行版中都带有的shell,因此在我们的shell脚本中为了保证脚本在各个linux平台上都可以稳定运行,建议使用 #!/bin/bash

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

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

相关文章

Python基础:推导式(Comprehensions)详解

1. 推导式概念 Python推导式(comprehensions)是一种简洁而强大的语法,用于从已存在的数据(列表、元组、集合、字典等)中创建新的数据结构。推导式包括: 列表推导式元组推导式字典推导式集合推导式 2. 列表…

第二证券:北证50飙升引发跷跷板效应

沪指周一低开震动,盘中一度杀跌进入3000点整数关口,尽管午后跌幅有所收窄,但毕竟收盘仍在30日均线下方。深成指相同低开低走,表现稍弱于沪指。到收盘,沪指报收3031.7点,跌落0.3%;深成指报收9785…

2019年8月29日 Go生态洞察:模块镜像和校验和数据库的发布

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

JUC(Java.util.concurrent)的常见类

目录 ♫ReentrantLock ♪什么是ReentrantLock ♪ReentrantLock的用法 ♪ReentrantLock和synchronized的区别 ♫Semaphore ♪什么是Semaphore ♪semaphore的用法 ♫CountDownLatch ♪什么是CountDownLatch ♪CountDownLatch的使用 ♫多线程环境使用ArrayList ♫多线程环…

第13周 预习、实验与作业:Java网络编程

目录 1 课前问题列表 1.编写一个网络程序,为了与其他网络程序通信,至少要知道对方的什么信息? 2.TCP与UDP协议有什么不同的呢?什么时候该选择哪种协议?HTTP使用的是TCP还是UDP?不重要的短信息传送之类的功能…

【每日一题】子数组的最小值之和

文章目录 Tag题目来源题目解读解题思路方法一:贡献法单调栈 写在最后 Tag 【贡献法】【单调栈】【数组】【2023-11-27】 题目来源 907. 子数组的最小值之和 题目解读 计算整数数组的连续子数组中最小值的和。 解题思路 本题朴素的解决思想是求出所有的连续子数组…

MySQL使用函数和存储过程实现:向数据表快速插入大量测试数据

实现过程 1.创建表 CREATE TABLE user_info (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,phone_number VARCHAR(11) DEFAULT NULL,email VARCHAR(255) DEFAULT NULL,address VARCHAR(255) DEF…

Aapche Dubbo 不安全的 Java 反序列化 (CVE-2019-17564)

漏洞描述 Apache Dubbo 是一个高性能的、基于 Java 的开源 RPC 框架。 Apache Dubbo 支持不同的协议,它的 HTTP 协议处理程序是 Spring Framework 的 .org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter Spring Framework 的安全警告显示&am…

涵盖多种功能,龙讯旷腾Module第一期:物质结构

Module是什么 在PWmat的基础功能上,我们针对用户的使用需求开发了一些顶层模块(Module)。这些Module中的一部分是与已有的优秀工具的接口,一部分是以PWmat的计算结果为基础得到实际需要的物理量,一部分则是为特定的计…

利用STM32和蓝牙模块构建智能物联网设备的开发指南

智能物联网设备在现代生活中扮演着重要的角色,而STM32微控制器和蓝牙模块则为实现智能物联网设备提供了基础支持。本文将介绍如何使用STM32微控制器和蓝牙模块构建智能物联网设备的开发指南,包括硬件设计、蓝牙模块配置、传感器数据采集和云平台连接等关…

Java 之 lambda 表达式(二)---- Stream 操作 API

目录 一. 前言 二. Stream 创建 2.1. 使用集合来创建 Stream 2.2. 使用数组创建 Stream 2.3. 由值创建 Stream 2.4. 由函数创建无限流 Stream 2.5. 代码示例 三. Stream 操作 3.1. 中间型操作 3.1.1. filter() 3.1.2. map() 3.1.3. mapToInt()、mapToLong()、mapTo…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/5)

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…