【发布时间】:2011-06-16 09:17:18
【问题描述】:
我有一个跨平台产品,可以部署到多个 Linux 发行版,我正忙于更改其中一个启动脚本。目前该脚本使用 /bin/sh 作为解释器。我的问题是。如果我将其更改为 /bin/bash,我有多安全,是否会出现未安装 bash 的情况或其他情况。为什么 /etc/init.d 中的所有脚本都使用 /bin/sh。使用 bash 时是否有一些东西会损坏?
【问题讨论】:
我有一个跨平台产品,可以部署到多个 Linux 发行版,我正忙于更改其中一个启动脚本。目前该脚本使用 /bin/sh 作为解释器。我的问题是。如果我将其更改为 /bin/bash,我有多安全,是否会出现未安装 bash 的情况或其他情况。为什么 /etc/init.d 中的所有脚本都使用 /bin/sh。使用 bash 时是否有一些东西会损坏?
【问题讨论】:
假设安装了 bash 属于同一类别
如果您牢记可移植性(至少对于 POSIX shell),您将为将来节省大量工作。有一天,您会发现自己身处一家不同的公司,拥有不同的操作系统和不同的外壳。那么你对 shell 可移植性的了解将带来巨大的好处。
告诉自己和他人的口头禅是:“假设是所有错误的根源。” :-)
【讨论】:
我可以假设 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 身份运行时将执行的非 POSIX 语法的具体示例。以#!/bin/sh --posix 调用shell 会改变这种行为吗?
这取决于你的应用程序有多“跨”平台。
如果它在“主要”Linux 发行版上运行,请随意假设 bash,但在较小的 dist 或自定义安装的情况下,bash 不是给定的。事实上,如果你离开 linux,我会更加小心地假设 bash(就此而言,/bin/bash 位置也不是给定的)。
/etc/init.d 脚本总是使用 /bin/sh 的原因是因为它在大多数平台上都是给定的。
我不认为如果你使用 bash 会破坏东西,bash 实现了与 sh 相同的“功能”,但反之则不然。因此,简而言之,如果您不需要 bash 特定功能,请使用 /bin/sh
【讨论】:
/usr/bin/bash(如果安装的话),它往往更喜欢 ksh。
/usr/local/bin/bash。