当前位置 : 主页 > 网络编程 > 其它编程 >

sh和Bash的区别

来源:互联网 收集:自由互联 发布时间:2023-07-02
什么是sh?sh(或Shell命令语言)是一种由POSIX标准描述的编程语言。它有许多实现(ksh88,Das 什么是sh? sh(或 Shell 命令语言)是一种由POSIX 标准描述的编程语言。它有许多实现(ksh88,
什么是sh?sh(或Shell命令语言)是一种由POSIX标准描述的编程语言。它有许多实现(ksh88,Das 什么是sh?

sh(或 Shell 命令语言)是一种由POSIX 标准描述的编程语言。它有许多实现(ksh88,Dash,…)。Bash 也可以被认为是sh(见下文)的一种实现。

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

什么是Bash?

Bash 最初是一个sh兼容的实现(尽管它比 POSIX 标准早了几年),但随着时间的推移,它已经获得了许多扩展。许多这些扩展可能会改变有效 POSIX shell 脚本的行为,因此 Bash 本身并不是一个有效的 POSIX shell。相反,它是 POSIX shell 语言的一种方言。

Bash 支持--posix开关,这使得它更符合 POSIX。如果调用为sh.

sh = bash?

很长一段时间以来,/bin/sh用于指向/bin/bash大多数 GNU/Linux 系统。因此,忽略两者之间的差异几乎是安全的。但这种情况最近开始发生变化。

/bin/sh一些没有指向/bin/bash(并且其中一些/bin/bash甚至可能不存在)的系统的流行示例是:

  • 现代 Debian 和 Ubuntu 系统,默认符号sh链接dash;
  • Busybox,它通常在 Linux 系统启动时作为initramfs. 它使用ash shell 实现。
  • BSD系统,通常是任何非 Linux 系统。OpenBSD使用的是KornShellpdksh的后代。FreeBSD是原始 Unix Bourne shell 的后代。 Solaris有自己的,长期以来不符合 POSIX 标准;Heirloom 项目提供免费实现。sh``sh
  • 如何找出/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 find都支持它。

    Shebang line

    最终,由您决定使用哪一个,将 «shebang» 行写为脚本的第一行。

    例如

    #!/bin/sh

    将使用sh(以及发生的任何事情),

    #!/bin/bash

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

    #!/bin/dash使用哪一个

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

    • 它是标准化的
    • 它更简单,更容易学习
    • 它可以跨 POSIX 系统移植——即使它们碰巧没有bash,它们也必须有sh

    使用也有好处bash。它的特性使编程更方便,类似于用其他现代编程语言进行编程。这些包括范围局部变量和数组之类的东西。Plainsh是一种非常简约的编程语言。


    上一篇:JAVA学习_Java学习多线程2
    下一篇:没有了
    网友评论