首页 文章

sh和bash之间的区别

提问于
浏览
995

编写shell程序时,我们经常使用 /bin/sh/bin/bash . 我通常使用 bash ,但我不知道它们之间的区别 .

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

bashsh 编程时我们需要注意什么?

9 回答

  • 920

    shhttp://man.cx/sh
    bashhttp://man.cx/bash

    TL;DRbashsh 的超集,具有更优雅的语法和更多功能 . 几乎在所有情况下使用bash shebang系列是安全的,因为它在现代平台上非常普遍 .

    注意:在某些环境中, shbash . 检查 sh --version .

  • 14

    TERMINAL

    • 程序放了一个窗口

    • xterm,rxvt,konsole,kvt,gnome-terminal,nxterm和eterm .

    SHELL

    • 是在终端中运行的程序

    • Shell既是命令解释器又是编程语言

    • Shell只是一个执行命令的宏处理器 .

    • 宏处理器是指扩展文本和符号以创建更大表达式的功能 .

    SH Vs. BASH

    SH

    • (SHell)

    • 是一个特定的shell

    • 命令解释器和编程语言

    • BASH的前身

    BASH

    • (Bourne-Again SHell)

    • 是一个特定的shell

    • 命令解释器和编程语言

    • 具有sh功能等

    • SH的继承人

    • BASH是默认的SHELL

    REFERENCE MATERIAL:

    SHELL gnu.org:

    在它的基础上,shell只是一个执行命令的宏处理器 . 术语宏处理器意味着扩展文本和符号以创建更大表达式的功能 . Unix shell既是命令解释器又是编程语言 . 作为命令解释器,shell为丰富的GNU实用程序提供了用户界面 . 编程语言功能允许组合这些实用程序 . 可以创建包含命令的文件,并自己成为命令 . 这些新命令与/ bin等目录中的系统命令具有相同的状态,允许用户或组 Build 自定义环境以自动执行其常见任务 . 壳可以以交互方式或非交互方式使用 . 在交互模式下,它们接受键盘输入的输入 . 当以非交互方式执行时,shell执行从文件读取的命令 . shell允许同步和异步执行GNU命令 . shell在接受更多输入之前等待同步命令完成;异步命令在读取和执行其他命令时继续与shell并行执行 . 重定向结构允许对这些命令的输入和输出进行细粒度控制 . 而且,shell允许控制命令环境的内容 . Shell还提供一小组内置命令(内置命令),实现不可能或不方便通过单独的实用程序获取的功能 . 例如,cd,break,continue和exec无法在shell外部实现,因为它们直接操作shell本身 . 历史,getopts,kill或pwd builtins等可以在单独的实用程序中实现,但它们作为内置命令使用起来更方便 . 所有shell内置函数都将在后续章节中介绍 . 虽然执行命令是必不可少的,但shell的大部分功能(和复杂性)都归功于它们的嵌入式编程语言 . 与任何高级语言一样,shell提供变量,流控制构造,引用和函数 . 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规范(IEEE标准1003.1)的IEEE POSIX Shell和Tools部分的一致实现 . 它为交互式和编程使用提供了超过sh的功能改进 . 虽然GNU操作系统提供其他shell,包括csh版本,但Bash是默认shell . 像其他GNU软件一样,Bash非常便携 . 它目前几乎运行在每个Unix版本和一些其他操作系统上 - 为MS-DOS,OS / 2和Windows平台提供独立支持的端口 .

  • 28

    对于试图使用 sh 的人来说,这个问题经常被提名为规范,并且惊讶于它的行为与 bash . 以下是常见误解和陷阱的快速概述 .

    首先,您应该了解会发生什么 .

    • 如果使用 sh scriptname 运行脚本,或者使用 scriptname 运行它并且shebang行中有 #!/bin/sh ,则应该期望POSIX sh 行为 .

    • 如果使用 bash scriptname 运行脚本,或者使用 scriptname 运行它并且在shebang行中有 #!/bin/bash (或本地等效项),则应该期望Bash行为 .

    拥有正确的shebang并通过仅键入脚本名称(可能具有相对路径或完整路径)来运行脚本通常是首选解决方案 . 除了正确的shebang之外,这还要求脚本文件具有执行权限( chmod a+x scriptname ) .

    那么,它们实际上有何不同?

    Bash参考手册有一个section which attempts to enumerate the differences,但一些常见的混淆来源包括

    • [[sh 中不可用(仅 [ ,这更笨重且有限) .

    • sh 没有数组 .

    • 某些Bash关键字(如 localfunctionselect )无法移植到 sh .

    • Bash有许多C风格的语法扩展,如 $'string\nwith\tC\aescapes' 和三参数 for((i=0;i<=3;i++)) 循环, += 增量赋值等 .

    • Bash支持 <<<'here strings' .

    • Bash有 *.{png,jpg}{0..9} 大括号扩展 .

    • ~仅在Bash中引用$ HOME(更常见的是〜用户名到主用户名的用户名) . 这是在POSIX中,但可能正在从某些POSIX /bin/sh 实现之前进行 .

    • Bash使用 <(cmd)>(cmd) 替换进程 .

    • Bash支持具有 <> 重定向的协同处理 .

    • Bash显着扩展了shell算法(尽管仍然没有浮点支持)和变量子串操作的设施,包括 ${substring:1:2}${variable/pattern/replacement} ,大小写转换等 .

    • 许多,仅限Bash的扩展,用于启用或禁用可选行为并公开shell的内部状态 .

    • 用于交互式使用的许多便利功能但不影响脚本行为 .

    请记住,这是一个简略的列表 . 有关完整的独家新闻,请参阅参考手册;有关许多良好的解决方法,请参阅http://mywiki.wooledge.org/Bashism;和/或尝试http://shellcheck.net/,警告许多Bash功能 .

    常见的错误是 #!/bin/bash shebang行,但是然后使用 sh scriptname 来实际运行脚本 . 这基本上禁用任何仅限Bash的功能,因此您会收到语法错误,例如尝试使用数组 .

    不幸的是,当您尝试使用这些构造时,Bash不会发出警告,因为它被调用为 sh . 它也没有完全禁用所有Bash功能,所以通过调用它来运行Bash为 sh 不是检查脚本是否可以正确移植到ash / dash / POSIX sh或类似Heirloom sh等变体的好方法

  • 94

    Linux操作系统提供不同类型的shell . 虽然shell有许多共同的命令,但每种类型都有独特的功能 . 让我们研究一下最常用的贝壳 .

    Sh shell:

    Sh shell也称为Bourne Shell . Sh shell是1977年AT&T贝尔实验室的Stephen Bourne为Unix计算机开发的第一个shell . 它包含许多脚本工具 .

    Bash shell :

    Bash shell代表Bourne Again Shell . Bash shell是大多数linux发行版中的默认shell,替代Sh Shell(Sh shell也将在Bash shell中运行) . Bash Shell无需修改即可执行绝大多数Sh shell脚本,并提供命令行编辑功能 .

  • 44

    什么是sh

    sh (或Shell命令语言)是POSIX standard描述的编程语言 . 它有许多实现( ksh88dash ,...) . bash 也可以被认为是 sh 的实现(见下文) .

    因为 sh 是规范而不是实现, /bin/sh 是大多数POSIX系统上实际实现的符号链接(或硬链接) .

    什么是bash

    bashsh 兼容的实现开始(尽管它早于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/bash 甚至可能不存在)的系统的一些常见示例是:

    • 现代Debian和Ubuntu系统,默认情况下符号链接 shdash ;

    • Busybox,通常在Linux系统启动时作为一部分运行of initramfs . 它使用 ash shell实现 .

    • BSD,通常是任何非Linux系统 . OpenBSD使用 pdksh ,它是Korn shell的后代 . FreeBSD的 sh 是原始UNIX Bourne shell的后代 . Solaris有自己的 sh ,很长一段时间不符合POSIX标准; Heirloom project提供免费实施 .

    你怎么能找到 /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 标志涵盖符号链接和硬链接,但这种方法的缺点是它不可移植 - 支持 -samefile 选项,尽管GNU findFreeBSD find都支持它 .

    Shebang线

    最终,由你来决定使用哪一个,通过编写«shebang»系列 .

    例如 .

    #!/bin/sh
    

    将使用 sh (以及任何恰好指向的东西),

    #!/bin/bash
    

    将使用 /bin/bash 如果's available (and fail with an error message if it'不是) . 当然,您也可以指定其他实现,例如

    #!/bin/dash
    

    使用哪一个

    对于我自己的脚本,我更喜欢 sh ,原因如下:

    • 它是标准化的

    • 它更简单,更容易学习

    • 它可以跨POSIX系统移植 - 即使它们没有 bash ,它们也需要 sh

    使用 bash 也有优势 . 它的功能使编程更方便,类似于其他现代编程语言的编程 . 这些包括范围局部变量和数组 . Plain sh 是一种非常简约的编程语言 .

  • 0

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

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

    BashB ourne a gain s hell)是Bourne shell的shell替代品 . 巴什是sh的超集 . Bash支持sh . POSIX是一组标准,用于定义POSIX兼容系统应如何工作 . Bash实际上不是POSIX兼容的shell . 在脚本语言中,我们将解释器表示为 #!/bin/bash .

    Analogy:

    • Shell就像一个接口或规范或API .

    • sh是一个实现Shell接口的类 .

    • Bash是sh的子类 .

    enter image description here

  • 21

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

    sh 至少支持required by POSIX功能(假设实现正确) . 它也可能支持扩展 .

    bash ,"Bourne Again Shell",实现了sh plus bash特定扩展所需的功能 . 完整的扩展集在这里描述的时间太长,并且随着新版本的不同而不同 . bash手册中记录了这些差异 . 输入 info bash 并阅读"Bash Features"部分(当前版本中的第6部分),或阅读current documentation online .

  • 3

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

    此外,还有一个很棒的工具叫做checkbashisms,它可以检查脚本中的bashisms,并且当你想确保你的脚本是可移植的时候会很方便 .

  • 38

    发表于UNIX.COM

    Shell features

    下表列出了我认为可以让您选择一个shell而不是另一个shell的大多数功能 . 它不是一个明确的列表,并不包含每个可能的shell的每个可能的功能 . 如果在操作系统附带的版本中,或者如果可以直接从标准分发编译,则该功能仅被视为在shell中 . 特别是下面指定的C shell是SUNOS 4. *上提供的,现在相当多的供应商提供了tcsh或者他们自己的增强型C shell(他们并不总是明确表示他们正在发送tcsh .

    Code:

    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
    

    Key to the table above.

    Y功能可以使用此shell完成 .

    外壳中不存在N功能 .

    F功能只能通过使用shell功能机制来完成 .

    L必须将readline库链接到shell以启用此功能 .

    Notes to the table above

    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.
    

相关问题