sh和bash之间的区别

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

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

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


什么是sh

sh (或Shell命令语言)是POSIX标准描述的编程语言。 它有许多实现( ksh88dash ,...)。 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/bash甚至可能不存在)的一些流行的系统示例如下:

  • 现代Debian和Ubuntu系统,默认符号链接sh dash ;
  • Busybox,通常在Linux系统启动时作为initramfs一部分运行。 它使用ash壳实现。
  • BSD和一般的非Linux系统。 OpenBSD使用pdksh ,它是Korn shell的后代。 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都支持它。

    Shebang线

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

    例如

    #!/bin/sh
    

    将使用sh (以及发生的任何指向),

    #!/bin/bash
    

    如果可用,将使用/bin/bash如果不是,则会失败并显示错误消息)。 当然,你也可以指定另一个实现,例如

    #!/bin/dash
    

    使用哪一个

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

  • 它是标准化的
  • 它更简单,更容易学习
  • 它可以跨POSIX系统移植 - 即使它们碰巧没有bash ,它们也必须有sh
  • 使用bash也有好处。 其功能使得编程更加方便,并且与其他现代编程语言的编程类似。 这些包括诸如作用域局部变量和数组之类的东西。 Plain sh是一种非常简约的编程语言。


    sh :http://man.cx/sh
    bash :http://man.cx/bash

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

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


    从UNIX.COM发布

    壳牌功能

    下表列出了我认为可以让您选择一个shell而不是另一个的大多数功能。 它并不打算成为一个明确的列表,也不包括每个可能shell的每一个可能的特性。 只有在操作系统附带的版本中才会将功能视为在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
    

    上表中的关键。

    Y功能可以使用这个shell来完成。

    N特征不存在于外壳中。

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

    L readline库必须链接到shell才能启用此功能。

    上表中的注释

    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.
    
    链接地址: http://www.djcxy.com/p/25611.html

    上一篇: Difference between sh and bash

    下一篇: Stop on first error