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

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

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


当前回答

终端

打开窗口的程序xterm、rxvt、konsole、kvt、gnome终端、nxtm和eterm。

外壳

是在终端中运行的程序Shell既是命令解释器也是编程语言Shell只是一个执行命令的宏处理器。宏处理器意味着可以扩展文本和符号以创建更大表达式的功能。

SH与BASH

SH

(SHell)是特定的外壳命令解释器和编程语言BASH的前身

BASH

(伯恩再次SHell)是特定的外壳命令解释器和编程语言具有sh功能等SH继任者BASH是默认的SHELL

参考材料:

外壳gnu.org网站:

在其基础上,shell只是一个执行命令。术语“宏处理器”是指文本和符号被展开以创建更大的表达式。Unix shell既是命令解释器,也是编程语言。作为命令解释器,shell为丰富的GNU实用程序集。编程语言功能允许这些实用程序将被合并。包含命令的文件可以是创建并成为命令本身。这些新命令具有与/bin等目录中的系统命令状态相同,允许用户或组可以建立自定义环境常见任务。壳可以交互或非交互使用。交互式模式下,它们接受从键盘键入的输入。执行时shell以非交互方式执行从文件读取的命令。shell允许同步执行GNU命令异步。shell等待同步命令完成在接受更多输入之前;异步命令继续执行与shell并行,同时它读取并执行其他命令。重定向构造允许对这些命令的输入和输出。此外,外壳允许控制命令环境的内容。外壳还提供一小组内置命令(内置命令)实现不可能或不方便通过独立的公用设施。例如,cd、break、continue和exec不能因为它们直接操纵外壳本身。历史、getopts、kill或pwd内置其他,可以在单独的实用程序中实现,但它们更多便于作为内置命令使用。所有的外壳都是如下文所述。虽然执行命令是必不可少的,但大多数功能(和复杂性)是由于它们的嵌入式编程语言。与任何高级语言一样,shell提供变量、流控件构造、引用和函数。外壳提供专门针对交互式使用的功能而不是扩充编程语言。这些交互功能包括作业控制、命令行编辑、命令历史记录和别名。本手册介绍了这些功能中的每一项。

BASH gnu.org网站:

Bash是GNU的shell或命令语言解释器操作系统。这个名字是“Bourne Again SHell”的首字母缩写,对斯蒂芬·伯恩(Stephen Bourne)的双关语当前的Unix shell sh,出现在第七版贝尔实验室Unix的研究版本。Bash在很大程度上与sh兼容,并包含有用的功能来自Korn shell ksh和C shell csh。它旨在成为IEEE POSIX Shell和Tools部分的一致实现IEEE POSIX规范(IEEE标准1003.1)对sh的交互和编程功能改进使用而GNU操作系统提供了其他shell,包括csh的版本,Bash是默认的shell。与其他GNU软件一样,Bash非常便携。它目前运行在几乎所有版本的Unix和其他一些操作系统-独立支持的端口适用于MS-DOS、OS/2和Windows平台。

其他回答

其他答案通常指出了Bash和POSIX外壳标准之间的区别。然而,当编写可移植的shell脚本并习惯于Bash语法时,一系列典型的bashms和相应的纯POSIX解决方案非常方便。当Ubuntu从Bash切换到Dash作为默认系统外壳时,已经编译了这样的列表,可以在这里找到:https://wiki.ubuntu.com/DashAsBinSh

此外,还有一个名为checkbashms的伟大工具,它可以检查脚本中的bashms,并且在您希望确保脚本可移植时非常方便。

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

/bin/sh可以也可以不调用与/bin/bash相同的程序。

sh至少支持POSIX所需的功能(假设实现正确)。它也可能支持扩展。

bash,即“Bourne Again Shell”,实现了sh+bash特定扩展所需的功能。完整的扩展集太长,无法在这里描述,并且随着新版本的不同而有所不同。这些差异记录在bash手册中。键入info bash并阅读“bash Features”部分(当前版本中的第6节),或在线阅读当前文档。

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环境变量指定文件。

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