在编写shell程序时,我们经常使用/bin/sh和/bin/bash。我通常使用bash,但我不知道它们之间有什么区别。
Bash和sh的主要区别是什么?
用Bash和sh编程时,我们需要注意什么?
在编写shell程序时,我们经常使用/bin/sh和/bin/bash。我通常使用bash,但我不知道它们之间有什么区别。
Bash和sh的主要区别是什么?
用Bash和sh编程时,我们需要注意什么?
当前回答
/bin/sh可以也可以不调用与/bin/bash相同的程序。
sh至少支持POSIX所需的功能(假设实现正确)。它也可能支持扩展。
bash,即“Bourne Again Shell”,实现了sh+bash特定扩展所需的功能。完整的扩展集太长,无法在这里描述,并且随着新版本的不同而有所不同。这些差异记录在bash手册中。键入info bash并阅读“bash Features”部分(当前版本中的第6节),或在线阅读当前文档。
其他回答
它们几乎相同,但bash有更多的功能——sh(或多或少)是bash的一个子集。
sh通常意味着最初的Bourne shell,它早于bash(Bourne*再次*shell),创建于1977年。但是,在实践中,最好将其视为符合1992年POSIX标准的高度交叉兼容的外壳。
以#!开头的脚本/bin/sh或使用shshell通常是为了向后兼容。任何unix/linux操作系统都会有一个sh shell。在Ubuntu上,sh经常调用dash,而在MacOS上,它是一个特殊的POSIX版本的bash。这些外壳可能是符合标准的行为、速度或向后兼容性的首选。
bash比原来的sh更新,增加了更多的功能,并寻求与sh向后兼容。sh程序通常在bash中运行得很好。bash在几乎所有linux/unix机器上都可用,并且通常在默认情况下使用,但值得注意的是,自Catalina(10.15)起,MacOS默认为zsh。默认情况下,FreeBSD没有安装bash。
Shell是用户和操作系统之间访问操作系统服务的接口。它可以是GUI或CLI(命令行界面)。
sh(Bourne shell)是一个shell命令行解释器,用于Unix/Unix类操作系统。它提供了一些内置命令。在脚本语言中,我们将解释器表示为#/bin/sh。它是其他shell如bash(免费/开放)、kash(非免费)最广泛支持的一种。
Bash(又称伯恩外壳)是伯恩外壳的替代品。Bash是sh的超集。Bash支持sh。POSIX是一组定义POSIX兼容系统应如何工作的标准。Bash实际上不是符合POSIX的shell。在脚本语言中,我们将解释器表示为#/bin/bash。
类比:
Shell就像一个接口、规范或API。sh是一个实现Shell接口的类。Bash是sh的一个子类。
差异以最简单的方式解释:
在基本了解之后,其他答案将更容易理解。
Shell-“Shell”是一个程序,它促进了用户和操作系统(内核)之间的交互。有许多可用的shell实现,如sh、Bash、C shell、Z shell等。
使用任何shell程序,我们都可以执行该shell程序支持的命令。
巴什-它又一次源自伯恩-壳牌。使用这个程序,我们将能够执行shell指定的所有命令。此外,我们将能够执行一些专门添加到此程序中的命令。Bash与sh向后兼容。
Sh-源自伯恩壳牌。“sh”支持shell中指定的所有命令。这意味着,使用这个程序,我们将能够执行Shell指定的所有命令。
有关详细信息,请参阅:
猛冲猛击
什是什么?
sh(或Shell命令语言)是由POSIX标准描述的编程语言。它有许多实现(ksh88、Dash…)。Bash也可以被认为是sh的实现(见下文)。
因为sh是一个规范,而不是一个实现,/bin/sh是大多数POSIX系统上实际实现的符号链接(或硬链接)。
什么是Bash?
Bash最初是一个sh兼容的实现(虽然它比POSIX标准早了几年),但随着时间的推移,它获得了许多扩展。这些扩展中的许多可能会改变有效POSIX shell脚本的行为,因此Bash本身并不是一个有效的POSIX shell。相反,它是POSIX shell语言的一种方言。
Bash支持--posix开关,这使其更符合posix。如果被调用为sh,它也会尝试模仿POSIX。
sh=bash?
很长一段时间以来,/bin/sh在大多数GNU/Linux系统上都指向/bin/bash。因此,忽略两者之间的差异几乎是安全的。但最近情况开始改变。
/bin/sh不指向/bin/bash的系统的一些常见示例(其中一些系统上甚至不存在/bin/bas)是:
现代Debian和Ubuntu系统,默认将sh符号链接到dash;Busybox,通常在Linux系统启动时作为initramfs的一部分运行。它使用ashshell实现。BSD系统以及一般的任何非Linux系统。OpenBSD使用pdksh,它是KornShell的后代。FreeBSD的sh是原始Unix Bourne shell的后代。Solaris有自己的sh,长期以来不符合POSIX;Heirloom项目提供了一个免费的实现。
如何找出/bin/sh在系统上指向的内容?
复杂的是/bin/sh可能是一个符号链接或硬链接。如果它是一个符号链接,一种可移植的解决方法是:
% file -h /bin/sh
/bin/sh: symbolic link to bash
如果是硬链接,请尝试
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
事实上,-L标志覆盖符号链接和硬链接,但这种方法的缺点是不可移植-POSIX不需要find来支持-samefile选项,尽管GNU find和FreeBSD find都支持它。
Shebang线
最终,由您决定使用哪一行,将“shebang”行作为脚本的第一行。
E.g.
#!/bin/sh
将使用sh(以及所指向的任何内容),
#!/bin/bash
将使用/bin/bash(如果不可用,则会失败并显示错误消息)。当然,您也可以指定其他实现,例如。
#!/bin/dash
使用哪一个
对于我自己的脚本,我更喜欢sh,原因如下:
它是标准化的它更简单易学它在POSIX系统中是可移植的——即使它们碰巧没有bash,也需要有sh
使用bash也有好处。它的特性使编程更加方便,与其他现代编程语言的编程类似。其中包括作用域局部变量和数组。Plain sh是一种非常简约的编程语言。
Linux操作系统提供了不同类型的shell。尽管shell有许多共同的命令,但每种类型都有独特的特性。让我们研究不同种类的常用贝壳。
Sh外壳:
Sh外壳也称为伯恩外壳。Shshell是1977年美国电话电报公司贝尔实验室斯蒂芬·伯恩为Unix计算机开发的第一个shell。它包括许多脚本工具。
Bash外壳:
Bash shell代表Bourne Again shell。Bash shell是大多数Linux发行版中的默认shell,并替代Sh shell(Sh shell也将在Bash shell中运行)。Bashshell可以执行绝大多数Shshell脚本而无需修改,并提供命令行编辑功能。