在编写shell程序时,我们经常使用/bin/sh和/bin/bash。我通常使用bash,但我不知道它们之间有什么区别。

Bash和sh的主要区别是什么?

用Bash和sh编程时,我们需要注意什么?


当前回答

UNIX.COM发布

外壳功能

下表列出了我认为可以让您选择一个外壳而不是另一个外壳的大多数功能。它不是一个明确的列表,也不包括每个可能的外壳的每个可能的特性。只有在操作系统附带的版本中,或者在直接从标准发行版编译的情况下,功能才被视为在shell中。特别是下面指定的C shell是SUNOS4.*上提供的,现在有相当多的供应商提供了tcsh或他们自己的增强型C shell(他们并不总是明显地表明他们正在提供tcsh)。

代码:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

上表的键。

Y功能可以使用此外壳完成。

外壳中不存在N功能。

F功能只能通过使用shell函数完成机械装置

L读线库必须链接到shell中才能启用此功能。

上表注释

此功能在原始版本中不存在,但现在已成为几乎是标准的。这一功能是相当新的,因此通常在许多版本的外壳,它正在逐渐进入标准分布。许多人认为这种外壳的Vi仿真是不完整。此功能不是标准功能,但存在非官方补丁执行此操作。名为“pdksh”的版本是免费提供的,但没有AT&T版本的全部功能。这可以通过外壳可编程完成机制完成。仅通过ENV环境变量指定文件。

其他回答

UNIX.COM发布

外壳功能

下表列出了我认为可以让您选择一个外壳而不是另一个外壳的大多数功能。它不是一个明确的列表,也不包括每个可能的外壳的每个可能的特性。只有在操作系统附带的版本中,或者在直接从标准发行版编译的情况下,功能才被视为在shell中。特别是下面指定的C shell是SUNOS4.*上提供的,现在有相当多的供应商提供了tcsh或他们自己的增强型C shell(他们并不总是明显地表明他们正在提供tcsh)。

代码:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

上表的键。

Y功能可以使用此外壳完成。

外壳中不存在N功能。

F功能只能通过使用shell函数完成机械装置

L读线库必须链接到shell中才能启用此功能。

上表注释

此功能在原始版本中不存在,但现在已成为几乎是标准的。这一功能是相当新的,因此通常在许多版本的外壳,它正在逐渐进入标准分布。许多人认为这种外壳的Vi仿真是不完整。此功能不是标准功能,但存在非官方补丁执行此操作。名为“pdksh”的版本是免费提供的,但没有AT&T版本的全部功能。这可以通过外壳可编程完成机制完成。仅通过ENV环境变量指定文件。

什:http://man.cx/sh 猛击:http://man.cx/bash

TL;DR:Bash是sh的超集,具有更优雅的语法和更多的功能。在几乎所有情况下使用Bash-shebang线路都是安全的,因为它在现代平台上非常普遍。

注意:在某些环境中,sh就是Bash。检查sh--版本。

什是什么?

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是一种非常简约的编程语言。

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的一个子类。

它们几乎相同,但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。