bash和sh的区别

2023-11-15

一、简述

Shell 中文意思贝壳,寓意类似内核的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。

sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。

bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。

dash (Debian Almquist shell)一种 Unix shell。它比 Bash 小,只需要较少的磁盘空间,但是它的对话性功能也较少。它由 NetBSD版本的Almquist shell (ash)发展而来,于1997年由赫伯特·许(Herbert Xu)移植到Linux上,于2002年改名为 dash。

二、含义

#!是一个特殊标记,说明这是一个可执行的脚本。除了第一行,其他以#开头的都不再生效,为注释。

#!后面是脚本的解释器程序路径。这个程序可以是shell,程序语言或者其他通用程序,常用的是bash、sh。

#!/bin/bash
 
#!/bin/sh

三、查看

cat /etc/shells    查看系统可使用的shell类型
 
cat /etc/passwd    查看当前默认设置,一般在第一行:
root:x:0:0:root:/root:/bin/bash
 
ll /bin/sh    查看当前sh状态
lrwxrwxrwx 1 root root 4 3月  31  2018 /bin/sh -> dash*

四、区别

sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。

POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )。POSIX标准意在期望获得源代码级别的软件可移植性。换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统上编译执行。

sh 脚本:
 
#!/bin/sh
source err
echo "test sh"
 
结果为:
testsh.sh: 2: testsh.sh: source: not found
bash 脚本:
#!/bin/bash
source err
echo "test sh"
 
结果为:
testsh.sh: 2: testsh.sh: source: not found
test sh

sh 跟bash的区别,实际上是bash有没开启POSIX模式的区别。

简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash --posix。

在Linux系统上/bin/sh往往是指向/bin/bash的符号链接

ln -s /bin/bash /bin/sh

但在Mac OS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节左右。

五、如何查看当前linux的shell是bash还是sh

echo $0

六、参考

https://www.cnblogs.com/conefirst/articles/15232323.html

/bin/bash和/bin/sh的区别 - 简书

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash和sh的区别 的相关文章

  • 如何正确使用fork、exec、wait

    我正在编写的 shell 需要执行用户提供给它的程序 这是我的程序的非常简短的简化版本 int main pid t pid getpid this is the parents pid char user input NULL size
  • “/bin/bash -l”无效选项

    好吧 我正在尝试在我们的超级计算机上运行隐藏为一项作业的串行 MPI 作业 主要提交脚本基本上如下所示 bin bash l PBS l nodes 4 ppn 8 walltime 24 00 00 cat PBS NODEFILE un
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 在 AIX 中使用 Mailx 通过电子邮件发送 SQLPlus 查询结果的 Shell 脚本

    我有我需要的命令 如果我在提示符下执行这些命令 一切都会按预期进行 SQLPlus 运行查询 将结果导出到文件 然后 Mailx 将该文件通过电子邮件发送给我 sqlplus username pwd instance SPOOL home
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 在 Bash 中监控 tomcat,直到它完成部署 war 或应用程序

    怎么可能Tomcat在 bash 脚本中进行监控以检测它是否完成了战争或应用程序的部署 应用场景 Tomcat 开始于systemd Tomcat 开始于catalina sh 使用 Tomcat 管理器 Tomcat从Eclipse启动
  • 设置 git 别名,但调用它会给出“找不到命令”

    我想在 git 中设置一个别名来计算存储库中的总行数 因此我进入 Git Bash 并输入以下内容 git config global alias linecount ls files z xargs 0 wc l 我输入命令后 没有出现错
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 测试 bash shell 脚本[重复]

    这个问题在这里已经有答案了 有人可以解释一下如何测试 bash shell 脚本吗 例如 我有一个 sh 文件 其中包含此代码 bin sh for file in txt do mv file basename file txt doc
  • Bash 中单行 while 循环的语法

    我无法找到分号和 或大括号的正确组合 我想这样做 但作为命令行中的一句 while 1 do foo sleep 2 done while true do foo sleep 2 done 顺便说一句 如果您在命令提示符下将其输入为多行 如

随机推荐

  • 漫画:什么是中台?

    没有中台的时代 在传统IT企业 项目的物理结构是什么样的呢 无论项目内部的如何复杂 都可分为 前台 和 后台 这两部分 什么是前台 首先 这里所说的 前台 和 前端 并不是一回事 所谓前台即包括各种和用户直接交互的界面 比如web页面 手机
  • CH1-Android基础入门

    文章目录 目标 一 资源的管理与使用 1 1 图片资源 1 2 主题和样式资源 1 3 布局资源 1 4 字符串资源 1 5 颜色资源 定义颜色值 1 6 尺寸资源 Android支持的尺寸单位 二 程序调试 2 1 单元测试 2 2 注意
  • hive中解决中文乱码

    一 个人初始开发环境的基本情况以及Hive元数据库说明 hive的元数据库改成了mysql 安装完mysql之后也没有进行其它别的设置 hive site xml中设置元数据库对应的配置为 jdbc mysql crxy99 3306 hi
  • Vue使用高德地图搜索功能

    下载依赖 yarn add amap amap jsapi loader 2 初始化高德地图 设置key和秘钥
  • Python numpy练习,纯英文ipynb作业26题,100%正确答案(付费)

    md Assigment 2 Instructions This problem set should be done individually Answer each question in the designated space be
  • njx如何实现负载均衡_LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡

    前言 首先声明下 由于这两天找资料 看了不少博客 但是出于不细心 参考者的博客地址没有记录下来 所有文中要是出现了与大家博客相同的地方 那么请大家在评论区说明并附上博客地址 我好引用进来 这里表示抱歉了 另外 本文是在我的另一篇博客主从热备
  • element-ui渲染el-table表格小技巧

    element ui中table的使用 当el table元素中注入data对象数组后 在el table column中用prop属性来对应对象中的键名即可填入数据 用label属性来定义表格的列名 可以使用width属性来定义列宽 相当
  • Qt 多项目系统中如何指定各项目的编译顺序 (***笔记)

    QT学习笔记 QT多项目系统中如何指定各项目的编译顺序 Qt pri 创建使用 pri文件 Qt pro文件 pri文件的写法 Qt 多项目系统中如何指定各项目的编译顺序 笔记 https blog csdn net ken2232 art
  • 目标跟踪算法——KCF入门详解

    一直以来没有很想写这个 以为这个东西比较简单 还算是比较容易理解的一个算法 但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西 我一直以为关于细节的东西大家可以自己去理解 大家都是想快速了解这个 那我就厚脸皮了在这写一下自己的见
  • 场景二:Git远程版本库的基本用法

    1 克隆远程版本库 如果你已经在Gitee或者GitHub等网站上创建了Git版本库 可以通过git clone命令 将版本库克隆到本地完成本地版本库的初始化 git clone命令的用法如下 git clone https DOMAIN
  • 由羽毛球拍想到的

    羽毛球拍 品牌太多 如何选择 看到红双喜厂商的具体套路 才知这个市场与手机市场一样 都是低端的外包 高端的自己做 但是 球拍这个东西高端的和低端的普通人能看出区别 许多生活中的产品都是如此 例如空调 格力之类的空调压缩机许多也是采购第三方的
  • Python之花舞盛宴:探索列表与元组之美与妙用

    前言 在Python编程世界中 列表和元组是两个最常用的数据结构之一 无论是初学者还是经验丰富的开发者 对于这两个数据类型的掌握都至关重要 列表和元组都是用于存储多个值的容器 但它们在性质和特性上有所不同 列表是可变的 可以随意修改 添加或
  • 用java有理数类包含加减乘除,7.1 面向对象的简介 - VimL 语言编程指北路

    面向对象是一种编程思想 并不特指某种编程语言 所以不必惊讶用 VimL 也能以面向 对象的方式来写代码 本章先简单介绍一下面向对象的编程思想 再探讨如何利用 VimL 现有的特性实现面向对象编程 最后应由用户自行决定是否有必要使用面向对象的
  • C++学习系列之求圆柱体的体积

    实例要求 以函数调用的方式 求圆柱体的体积 主函数中先输入圆柱体的半径和高 调用求体积的函数 输出结果 代码如下 include
  • linux服务器运维

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 no space left on device 原因 磁盘满了 inode耗尽
  • 如何将Web主页性能提升十倍以上?

    给IT平头哥联盟加星标 提升前端技能 作者 exAspArk 译者 核子可乐 最近 我们将 Universe com 主页的性能提升了十倍以上 在本文中 我们将解析实现这一重大改进的具体技术手段 但在开始之前 让我们先对网络性能的重要意义进
  • C 基本语法

    原文链接 https www runoob com cprogramming c basic syntax html 我们已经看过 C 程序的基本结构 这将有助于我们理解 C 语言的其他基本的构建块 C 的令牌 Tokens C 程序由各种
  • Selenium+python之不打开浏览器,来运行测试用例

    调用浏览器 来进行自动化测试 是一个常规操作 或者说针对少量测试用例 可以打开浏览器运行 但是针对大量运行测试用例来说 如果每个测试用例都需要调用一次 浏览器 那么无疑对服务器增加了巨大的压力 那么有没有一个办法 不调用浏览器 让浏览器在后
  • (只需两步)让ChatGPT免费帮你制作出漂亮的PPT

    目录 第一步 生成 PPT 代码 第二步 将代码转化为 PPT 还在为制作PPT而烦恼吗 让ChatGPT来帮您 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式 省时省力又专业 真的只需两步 真的非常简单 以下部分生成效果 pp
  • bash和sh的区别

    一 简述 Shell 中文意思贝壳 寓意类似内核的壳 Shell是指一种应用程序 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务 Shell 是一个用 C 语言编写的程序 它是用户使用 Linux 的桥梁 Shell 既