关于shell:sh和bash之间的区别

Difference between sh and bash

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

bashsh的主要区别是什么?

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


什么是SH

sh(或命令语言)描述的是一个由POSIX编程语言标准。它有许多的实现(ksh88dash,……)。可以bash在实施被视sh(湖下面)。

因为sh是一个规范,需要执行一个链接,/bin/sh(或硬链接)到实际的实施在POSIX系统最。

什么是bash

在开始做bashsh兼容的实现(虽然它是POSIX标准的predates几年),但它已获得多个时间传递扩展。许多论文的扩展可能改变的行为或POSIX shell脚本),所以它不是一个有效的bashPOSIX外壳。但是,它是POSIX语言方言的壳。

--posixbashA开关支持,这使得它更符合POSIX标准。如果是商务模拟shPOSIX invoked AS。

bash的SH =?

很长一段时间,/bin/sh用于点到最/bin/bash在GNU / Linux系统。作为一个结果,它几乎成为一个不安全的差异之间的两个。但最近我开始变化。

在一些例子,系统/bin/sh流行不到/bin/bash(和在一些点可能不存在,这是不/bin/bash):

  • 现代的Debian和Ubuntu系统默认是链接到dashsh
  • BusyBox是通常运行在Linux系统启动时initramfsAS的一部分。它使用的ash外壳实现。
  • BSD和Linux系统中任何非通用。pdkshOpenBSD使用A的玉米壳,前卫。FreeBSD是一个前卫的sh伯恩的原始Unix的外壳。有自己的shSolaris是一个长的时间,需要的是什么,一个免费的POSIX兼容的;从heirloom项目实施是可用的。
  • 你如何能找到什么/bin/sh点在您的系统?

    这是/bin/sh并发症可能是一个符号链接或软链接。如果它是一个符号链接,它是便携式的方式来解决:

    1
    2
    % file -h /bin/sh
    /bin/sh: symbolic link to bash

    如果它是一个硬链接,尝试

    1
    2
    3
    % find -L /bin -samefile /bin/sh
    /bin/sh
    /bin/bash

    事实上,无论是硬链接和符号链接-L旗盖,但这个方法的缺点是,它是一个便携式不需要findPOSIX的支持-samefile选项虽然都是FreeBSD支持的GNU和找到它。

    事情的经过线

    最终,这是你决定哪一个使用,由写的吗?事情的经过吗?线。

    例如

    1
    #!/bin/sh

    要使用sh(和什么字点去)

    1
    #!/bin/bash

    要使用它/bin/bash(和一个可用的故障错误消息如果它不是)。当然,你也可以指定一个执行。

    1
    #!/bin/dash

    一个使用。

    我喜欢自己的脚本,sh为以下原因:

    • 它是标准化的
    • 它是非常简单和容易的了解
    • 在POSIX系统是便携式,即使他们有一bash困境,他们都要求有sh

    有优势,利用bash为好。它的编程方便和使更多的功能类似于其他编程语言的编程风格。本文包括一个本地变量和数组类的东西。sh平原是一个简约的编程语言。


    sh:http://man.cx / SHbash:http://man.cx /狂欢

    钛;bash博士:是一个优雅的superset of sh更多的语法和更多的功能。它是安全的使用A线在几乎所有的情况下bash事情的经过,因为它无处不在的现代好的平台上。

    注:在某些环境下,shbashsh --version检查。


    这个问题经常被指定为那些试图使用sh的人的规范,并且惊讶于它的行为与bash不同。下面是常见误解和陷阱的简要介绍。

    首先,你应该理解期望的是什么。

    • 如果使用sh scriptname运行脚本,或者使用scriptname运行脚本,并且在shebang行中使用#!/bin/sh,那么应该期望posix sh行为。
    • 如果使用bash scriptname运行脚本,或者使用scriptname运行脚本,并在shebang行中使用#!/bin/bash或本地等效的脚本,那么应该期望bash行为。

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

    那么,它们到底有什么不同呢?

    bash参考手册有一节试图列举差异,但一些常见的混淆源包括

    • [[sh中不可用(只有[更为笨重和有限)。
    • sh没有数组。
    • 有些bash关键字,如localsourcefunctionselect,不可移植到sh。(一些sh实现支持,如local)
    • bash有许多C风格的语法扩展,如$'string
      with\tC\aescapes'
      和三参数for((i=0;i<=3;i++))循环、+=增量赋值等。
    • bash支持<<<'here strings'
    • 巴什有*.{png,jpg}{0..12}两个支柱扩张。
    • ~refered to $HOMEonly in bash(and more generally ~usernameto the home directory of usernamethis is in posix,but may be mising from some pre-posix /bin/shimplements.
    • bash与<(cmd)>(cmd)进行过程替换。
    • bash有csh风格的方便重定向别名,如2>&1 |&|> ... 2>&1&>
    • bash支持与<>重定向的协处理。
    • bash具有丰富的扩展非标准参数扩展集,如${substring:1:2}${variable/pattern/replacement}、case转换等。
    • bash为shell算法(尽管仍然没有浮点支持)提供了显著的扩展功能。
    • 许多、许多仅用于bash的扩展,用于启用或禁用可选行为并公开shell的内部状态。
    • 许多,许多交互使用的便利功能,但不影响脚本行为。

    记住,这是一个简短的清单。参考参考手册了解完整的独家新闻,http://mywiki.wooledge.org/bashism了解许多好的解决方法;和/或尝试http://shellcheck.net/,其中警告许多仅针对bash的功能。

    一个常见的错误是使用#!/bin/bashshebang行,但是仍然使用sh scriptname实际运行脚本。这基本上禁用了任何仅限bash的功能,因此您会遇到语法错误,例如,尝试使用数组时出错。

    不幸的是,当bash作为sh调用时,当您尝试使用这些构造时,它不会发出警告。它也不能完全禁用所有bash-only功能,因此通过调用bash来运行它,因为sh不是检查脚本是否可以正确地移植到ash/dash/posix sh或类似于祖传sh的变体的好方法。


    从unix.com发布

    壳体特征

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

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
                                         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功能只能通过使用shells函数来完成机制。

    l必须将阅读线库链接到shell才能启用这个特点。

    上表注释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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.


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

    sh(bourne shell)是一个shell命令行解释器,用于类Unix/Unix操作系统。它提供了一些内置命令。在脚本语言中,我们将解释器表示为#!/bin/sh。它是由其他外壳(如bash(free/open)、kash(not free)等)最广泛支持的。

    bash(又称bourne shell)是bourne shell的shell替代品。bash是sh的超集。bash支持sh。posix是一组定义posix兼容系统应该如何工作的标准。bash实际上不是一个符合POSIX的shell。在脚本语言中,我们将解释器表示为#!/bin/bash

    类比:

    • shell类似于接口、规范或API。
    • sh是实现shell接口的类。
    • bash是sh的一个子类。

    enter image description here


    终端

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

    壳牌

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

    嘘嘘

    • (壳牌)
    • 是一个特定的外壳
    • 命令解释程序和程序设计语言
    • bash的前身

    猛击

    • (又是伯恩·壳牌)
    • 是一个特定的外壳
    • 命令解释程序和程序设计语言
    • 具有sh功能等
    • SH继承人
    • bash是默认shell

    参考材料:

    壳牌GNU-ORG:

    At its base, a shell is simply a macro processor that executes
    commands. The term macro processor means functionality where text and
    symbols are expanded to create larger expressions.

    A Unix shell is both a command interpreter and a programming language.
    As a command interpreter, the shell provides the user interface to the
    rich set of GNU utilities. The programming language features allow
    these utilities to be combined. Files containing commands can be
    created, and become commands themselves. These new commands have the
    same status as system commands in directories such as /bin, allowing
    users or groups to establish custom environments to automate their
    common tasks.

    Shells may be used interactively or non-interactively. In interactive
    mode, they accept input typed from the keyboard. When executing
    non-interactively, shells execute commands read from a file.

    A shell allows execution of GNU commands, both synchronously and
    asynchronously. The shell waits for synchronous commands to complete
    before accepting more input; asynchronous commands continue to execute
    in parallel with the shell while it reads and executes additional
    commands. The redirection constructs permit fine-grained control of
    the input and output of those commands. Moreover, the shell allows
    control over the contents of commands’ environments.

    Shells also provide a small set of built-in commands (builtins)
    implementing functionality impossible or inconvenient to obtain via
    separate utilities. For example, cd, break, continue, and exec cannot
    be implemented outside of the shell because they directly manipulate
    the shell itself. The history, getopts, kill, or pwd builtins, among
    others, could be implemented in separate utilities, but they are more
    convenient to use as builtin commands. All of the shell builtins are
    described in subsequent sections.

    While executing commands is essential, most of the power (and
    complexity) of shells is due to their embedded programming languages.
    Like any high-level language, the shell provides variables, flow
    control constructs, quoting, and functions.

    Shells offer features geared specifically for interactive use rather
    than to augment the programming language. These interactive features
    include job control, command line editing, command history and
    aliases. Each of these features is described in this manual.

    Bash GNU-ORG:

    Bash is the shell, or command language interpreter, for the GNU
    operating system. The name is an acronym for the ‘Bourne-Again SHell’,
    a pun on Stephen Bourne, the author of the direct ancestor of the
    current Unix shell sh, which appeared in the Seventh Edition Bell Labs
    Research version of Unix.

    Bash is largely compatible with sh and incorporates useful features
    from the Korn shell ksh and the C shell csh. It is intended to be a
    conformant implementation of the IEEE POSIX Shell and Tools portion of
    the IEEE POSIX specification (IEEE Standard 1003.1). It offers
    functional improvements over sh for both interactive and programming
    use.

    While the GNU operating system provides other shells, including a
    version of csh, Bash is the default shell. Like other GNU software,
    Bash is quite portable. It currently runs on nearly every version of
    Unix and a few other operating systems - independently-supported ports
    exist for MS-DOS, OS/2, and Windows platforms.


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

    此外,还有一个名为checkbashims的伟大工具,它可以检查脚本中的bashims,并在需要确保脚本可移植时提供便利。


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

    sh至少支持posix所需的特性(假设实现正确)。它也可以支持扩展。

    bash,"bourne-again-shell",实现了特定于sh和bash的扩展所需的特性。完整的扩展集太长,无法在这里描述,它随新版本的不同而变化。差异记录在bash手册中。键入info bash并阅读"bash特性"部分(当前版本中的第6节),或者在线阅读当前文档。


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

    SH壳牌:

    sh shell也被称为bourne shell。SHshell是美国电话电报公司贝尔实验室的斯蒂芬·伯恩于1977年为Unix计算机开发的第一个shell。它包括许多脚本工具。

    巴什贝壳:

    bash shell再次代表bourne shell。bash shell是大多数Linux发行版中的默认shell,它可以替代sh shell(sh shell也将在bashshell中运行)。bash shell可以在不进行修改的情况下执行绝大多数sh shell脚本,还提供命令行编辑功能。