Linux 中 bash 和 sh 的区别

2024-05-05 渥太华微生活

c0807d2e2b594f999e989466ad089356.jpeg


一、简述

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。

images.jpg


二、含义

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

#! 后面是脚本的解释器程序路径。这个程序可以是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*

2023060716410550054.jpeg

四、区别

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

二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

85
全部评论 (0)
展开快速发表评论

科技专栏