sh和bash之间的区别

那年仲夏 提交于 2020-01-07 00:51:16

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

bashsh之间的主要区别是什么?

在使用bashsh编程时,我们需要注意什么?


#1楼

Shell是用户和OS之间的接口,用于访问操作系统的服务。 它可以是GUI或CLI(命令行界面)。

sh (Bourne sh ell)是一个Shell命令行解释器,用于类似Unix / Unix的操作系统。 它提供了一些内置命令。 在脚本语言中,我们将解释器表示为#!/bin/sh 。 它是bash(自由/开放),kash(非自由)之类的其他shell支持最广泛的一种。

(B ourne 增益 地狱)是一个外壳更换对于Bourne壳。 Bash是sh的超集。 Bash支持sh。 POSIX是一组定义POSIX兼容系统应如何工作的标准。 Bash实际上不是POSIX兼容的外壳。 在脚本语言中,我们将解释器表示为#!/bin/bash

比喻:

  • Shell就像一个接口或规范或API。
  • sh是实现Shell接口的类。
  • Bash是sh的子类。


#2楼

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

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

bash (“ Bourne Again Shell”)实现了sh以及bash特定的扩展所必需的功能。 完整的扩展程序集太长,无法在此处描述,并且随新版本的发布而变化。 差异记录在bash手册中。 输入info bash并阅读“ Bash功能”部分(当前版本中的第6部分),或者在线阅读当前文档


#3楼

其他答案通常指出Bash与POSIX Shell标准之间的区别。 但是,在编写可移植的shell脚本并使用Bash语法时,非常典型的bashism列表和相应的纯POSIX解决方案非常方便。 当Ubuntu从Bash切换为Dash作为默认系统外壳时,已经编译了此类列表,可以在以下位置找到: https : //wiki.ubuntu.com/DashAsBinSh

而且,有一个很棒的工具叫做checkbashisms ,它可以检查脚本中的bashisms,并且在您要确保脚本可移植时很方便。


#4楼

UNIX.COM发布

外壳功能

下表列出了我认为会让您选择一个外壳而不是另一个外壳的大多数功能。 它不打算作为权威列表,也不包括每个可能的shell的每个可能的功能。 仅当功能在操作系统随附的版本中,或者可以从标准发行版直接编译得到时,才认为该功能在外壳程序中。 特别是,下面指定的C Shell在SUNOS 4. *上可用,现在许多供应商都提供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

上表的关键字。

可以使用此shell完成功能。

N功能不存在于外壳中。

F功能只能通过使用shell函数机制来完成。

L必须将readline库链接到外壳中才能启用此功能。

上表说明

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.

#5楼

终奌站

  • 打开窗口的程序
  • xterm,rxvt,konsole,kvt,gnome-terminal,nxterm和eterm。

贝壳

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

相对于 重击

SH

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

重击

  • (Bourne-Again SHell)
  • 是特定的外壳
  • 命令解释器和编程语言
  • 具有sh功能及更多
  • SH的继任者
  • BASH是默认的SHELL

参考资料:

外壳 gnu.org:

根本上说外壳程序只是执行命令的宏处理器 。 术语宏处理器是指将文本和符号扩展以创建更大的表达式的功能。

Unix shell既是命令解释器又是编程语言。 作为命令解释器,shell为丰富的GNU实用程序集提供了用户界面。 编程语言功能允许组合这些实用程序。 包含命令的文件可以创建,也可以成为命令本身。 这些新命令与/ bin等目录中的系统命令具有相同的状态,从而允许用户或组建立自定义环境以自动化其常见任务。

外壳可以交互使用或非交互使用。 在交互模式下,它们接受键盘输入的输入。 当以非交互方式执行时,shell执行从文件读取的命令。

Shell允许同步和异步执行GNU命令。 在接受更多输入之前,shell等待同步命令完成。 异步命令继续与外壳程序并行执行,同时读取并执行其他命令。 重定向结构允许对这些命令的输入和输出进行细粒度的控制。 而且,外壳程序允许控制命令环境的内容。

Shell还提供了一小组内置命令(builtins),这些命令实现了无法或不方便通过单独的实用程序获得的功能例如,cd,break,continue和exec不能在Shell外部实现,因为它们直接操纵Shell本身。 历史记录,getopts,kill或pwd内置程序等可以在单独的实用程序中实现,但是用作内置命令更方便。 后续各节将介绍所有的shell内建函数。

尽管执行命令是必不可少的,但是大多数Shell的功能(和复杂性)都归功于它们的嵌入式编程语言。 像任何高级语言一样,shell提供变量,流控制构造,引用和函数。

Shell提供了专门为交互使用而设计的功能,而不是扩展编程语言。 这些交互式功能包括作业控制,命令行编辑,命令历史记录和别名。 这些功能中的每一个都在本手册中进行了描述。

BASH gnu.org:

Bash是GNU操作系统的外壳程序或命令语言解释器。 该名称是'Bourne-Again SHell'的首字母缩写,它是Stephen Bourne的双关语,Stephen Bourne是当前Unix shell sh的直接祖先的作者,该版本出现在Unix的第七版Bell Labs Research版本中。

Bash在很大程度上与sh兼容,并结合了Korn shell ksh和C shell csh的有用功能。 它旨在成为IEEE POSIX规范(IEEE标准1003.1)的IEEE POSIX外壳和工具部分的一致实现。 它提供了相对于sh的功能改进,可用于交互和编程。

虽然GNU操作系统提供了其他shell,包括csh版本,但Bash是默认的shell 。 像其他GNU软件一样,Bash具有很好的可移植性。 目前,它几乎可以在Unix的每个版本和其他一些操作系统上运行-MS-DOS,OS / 2和Windows平台具有独立支持的端口。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!