【问题标题】:Bash or Bourne Scripts?Bash 还是 Bourne 脚本?
【发布时间】:2011-02-12 23:05:37
【问题描述】:

编写 Bash 脚本或 Bourne 脚本更好吗?我的团队编写 Bourne 脚本,但我不完全确定原因。

如果这是一个圣战问题(即:vim 与 emacs),请回复:圣战。

【问题讨论】:

  • 只要不是 csh
  • Korn 中真正的程序员代码! :-P 与 bash 相比,我总是更喜欢 sh,因为在大多数发行版中,大多数语法/功能的东西都将相同或至少与 sh 行为兼容;而如果您使用 AIX 等,则 bash 在某些情况下不可用。但如果您使用的是纯 Linux 脚本,则 bash 更可取。让编程更容易恕我直言。

标签: bash scripting sh


【解决方案1】:

我使用 Bash 作为我的登录 shell,但对于脚本,我会在一周中的任何一天选择 Bourne shell,在周日选择两次。 Bash 具有更好的功能、更好的用户友好性和更好的错误。

实际上,让我在登录时选择 Bash 的东西,让我在编写脚本时避免使用它。 Bash 试图让用户的一切变得舒适和舒适,但代价是 776 kB 的可执行文件(在我的机器上),而 Bourne shell 则为 140 kB。为什么我的脚本会关心用户友好性?我可能通过使用一些聪明的 Bash 函数获得的任何收益都被 shell 占用空间有效地抵消了,它是原来的五倍多。

我有运行 Linux、FreeBSD 和 OS X 的计算机。虽然我很少在计算机之间移动任何东西,但很高兴有这种可能性。在 Bourne shell 脚本中,您只需键入

#!/bin/sh

它只是工作。总是。 Bash 在 Linux 上可能很常见,但它不像 Bourne shell 那样标准化。在 FreeBSD 上,默认情况下不安装 Bash。如果系统管理员认为这是一个好主意,它可以从 Ports 安装,但即便如此,它也会在 /usr/local/bin/bash (不是 /bin/bash >)。因此,如果你仍然决定使用 Bash,你应该写

#!/usr/bin/env bash

使脚本可移植。 env 将为您找到 shell,无论您的 Unix 风格如何(只要它已安装)。

归根结底,这是您的选择。只需确保您的脚本实际上兼容您选择的外壳,而不是依赖“sh”符号链接到“bash”或类似的东西。

【讨论】:

    【解决方案2】:

    在 Mac OS X 上 /bin/sh 不是 Bourne shell。 (但你可能会在新鲜肉上得到真正的 bournesh)。

    要识别传统的 Bourne shell,您可以尝试使用抑扬符 ^(插入符号)代替 | (管道)。

    见:

    传统的 Bourne Shell 家族,

    http://www.in-ulm.de/~mascheck/bourne/

    【讨论】:

      【解决方案3】:

      便携性。我写#!/bin/sh,除非事情真的很痛苦,然后我写#!/bin/bash。世界瞬息万变,我敢打赌,将来说服系统管理员安装 bash 会很容易。但是我在大多数事情上都使用 Bourne 来对冲我的赌注,这很简单。

      【讨论】:

        【解决方案4】:

        我会再次选择 bourne shell,因为 bourne shell 在 unix 实现中可能略有不同。使用bash,您可以确定bash 始终是bash

        【讨论】:

        • 我不会说不同的 shell 操作不同。如果以 sh 开头,我所知道的任何 shell 都会退回到 bourne shell 行为
        • 我见过表现不同的不同的 bourne shell (sh) 实现。也许现在已经不是这样了。
        • "使用 bash,您可以确定 bash 始终是 bash。"除非它是不同版本的 Bash。主版本号之间存在明显的差异,但次版本号之间也存在一些差异。
        • ...但你是对的,Bourne(至少通过它)可以“更加不同”。
        【解决方案5】:

        最重要的是要记住,并非每个操作系统都像某些 Linux 发行版那样将 /bin/sh 软链接到 /bin/bash。很多脚本都是为 bash 编写的,但开头是:

        #!/bin/sh
        

        这样它们就会破裂,例如在 Ubuntu 中。所以,当你写 bash 脚本时,总是写:

        #!/bin/bash
        

        【讨论】:

        • 我的一个牛人对 Ubuntu 很生气,因为他们在 /bin/sh 中使用了除 bash 之外的其他东西。我告诉他他应该对那些将他们的 bash 脚本错误标记为 sh 脚本的白痴生气,但他不同意我的看法。
        • 不,你应该总是写#!/usr/bin/env bash。 Bash 可能安装在您机器上的 /bin/bash 中,但这是非标准化和非通用的。但是,如果您坚持使用#!/bin/sh,您可能会没事的。
        【解决方案6】:

        这取决于你的目标平台是什么。

        如果您只针对主要的 Linux 发行版和 Mac OS X,那么您可以确信这些系统将提供 bash。在其他 UNIX(例如 AIX、Solaris、HP-UX)上,bash 可能不一定存在,因此 Bourne 是更安全的选择。如果 bash 可用,我想不出你会喜欢 Bourne 的理由。

        【讨论】:

          【解决方案7】:

          嗯,这是一个品味问题,但对于初学者来说,bourne shell 脚本可以用 bash 运行,而且我认为 bash 具有 Bourne 无法运行的功能。

          【讨论】:

            【解决方案8】:

            您可以更加确定 Bourne shell 将安装在任何给定的 Unix 计算机上。是的,Bash 在 Linux 上无处不在,但整个世界都不是 Linux。

            【讨论】:

            • 在某种程度上,我只能想到三个原因:向后兼容性、可移植性或“这是我们一直这样做的方式。”
            • “Bash 在 Linux 上无处不在,但整个世界都不是 Linux。”这是我之前的信念,然后我开始使用 Solaris 和 HP-UX 机器。我以为我可以在 Bash 中为这些机器编写 shell 脚本,哦,我错了。但这是一次很好的谦虚学习体验,现在我总是使用 bourne shell,并且只有我知道的符合 POSIX 的语法。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-21
            • 1970-01-01
            • 2016-03-15
            • 2019-05-21
            • 1970-01-01
            • 2010-12-19
            相关资源
            最近更新 更多