【问题标题】:Can I assume bash is installed我可以假设安装了 bash
【发布时间】:2011-06-16 09:17:18
【问题描述】:

我有一个跨平台产品,可以部署到多个 Linux 发行版,我正忙于更改其中一个启动脚本。目前该脚本使用 /bin/sh 作为解释器。我的问题是。如果我将其更改为 /bin/bash,我有多安全,是否会出现未安装 bash 的情况或其他情况。为什么 /etc/init.d 中的所有脚本都使用 /bin/sh。使用 bash 时是否有一些东西会损坏?

【问题讨论】:

    标签: linux bash debian


    【解决方案1】:

    假设安装了 bash 属于同一类别

    • 全世界都是 VAX
    • 所有 CPU 都是 i386
    • 所有免费的 Unixen 都是 Linux
    • 所有的 IDE 都是 Eclipse
    • 所有编译器都是gcc

    如果您牢记可移植性(至少对于 POSIX shell),您为将来节省大量工作。有一天,您会发现自己身处一家不同的公司,拥有不同的操作系统和不同的外壳。那么你对 shell 可移植性的了解将带来巨大的好处。

    告诉自己和他人的口头禅是:“假设是所有错误的根源。” :-)

    【讨论】:

      【解决方案2】:

      我可以假设 bash 已安装

      如果以可移植性为目标,那么假设安装了bash 是对自己的伤害。这并不是说bash 不会在 99% 的情况下安装,但只有 1% 的情况下才会安装。

      如果我把它改成 /bin/bash 有多安全,会不会有没有安装 bash 之类的情况

      bash 是一个POSIX Compliant shell,所以除非您需要/想要使用纯 bash 语法,否则我不会一时兴起将解释器行更改为 #!/bin/bash;与 #!/bin/sh 一起使用的脚本不会给您带来任何好处

      为什么所有的脚本都在 /etc/init.d 使用 /bin/sh

      因为如果管理员决定通过删除 bash 来节省硬盘空间,他们不希望系统崩溃,因为他最喜欢的 shell 是 zsh

      是否有一些东西会损坏 什么时候使用 bash?

      反之亦然。如果您有一个仅使用 bash(非 POSIX)语法的脚本,例如 [[ ]] 或进程替换 <( ),如果您将解释器从 #!/bin/bash 更改为 #!/bin/sh,这将中断

      【讨论】:

      • 另外,启动脚本使用sh,因为它比 Bash 更快。
      • 在 /bin/sh 是指向 /bin/bash 的链接的系统上,即使使用 /bin/sh 在 sh“兼容”模式下运行 bash,它也不完全兼容。仍然可以使用特定于 bash 的语法并使其与链接到 bash 的 /bin/sh 一起使用,但在使用更严格兼容的 shell(如 dash)时不起作用。
      • @Arrowmaster 您能否提供 bash 在以 /bin/sh 身份运行时将执行的非 POSIX 语法的具体示例。以#!/bin/sh --posix 调用shell 会改变这种行为吗?
      • mywiki.wooledge.org/Bashism wiki.ubuntu.com/DashAsBinSh Debian 和 Ubuntu 已将 sh 从 bash 切换到 dash,因此您可以在他们对 sh 脚本所做的更改中找到大量示例,他们甚至有工具中的 checkbashisms 脚本可帮助找到它们。
      【解决方案3】:

      这取决于你的应用程序有多“跨”平台。

      如果它在“主要”Linux 发行版上运行,请随意假设 bash,但在较小的 dist 或自定义安装的情况下,bash 不是给定的。事实上,如果你离开 linux,我会更加小心地假设 bash(就此而言,/bin/bash 位置也不是给定的)。

      /etc/init.d 脚本总是使用 /bin/sh 的原因是因为它在大多数平台上都是给定的。

      我不认为如果你使用 bash 会破坏东西,bash 实现了与 sh 相同的“功能”,但反之则不然。因此,简而言之,如果您不需要 bash 特定功能,请使用 /bin/sh

      【讨论】:

      • 是的,在 *BSD 上通常是 /usr/bin/bash(如果安装的话),它往往更喜欢 ksh。
      • 在 FreeBSD 上,如果安装包或端口时没有附加选项,则至少是 /usr/local/bin/bash
      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 2018-07-17
      • 1970-01-01
      相关资源
      最近更新 更多