我有一个跨平台产品,可以部署到几个Linux发行版,我正在忙着更改其中一个启动脚本。目前该脚本使用/ bin / sh作为解释器。我的问题是。如果我将其更改为/ bin / bash,我会有多安全,是否会出现某些未安装bash或其他情况的情况。为什么/etc/init.d中的所有脚本都使用/ bin / sh。使用bash时会有一些东西会破坏吗?
答案 0 :(得分:12)
我可以假设已安装bash
如果可移植性是一个目标,那么假设bash
已安装,您将自行承担责任。这并不是说99%的时间不会安装bash
,而是获得ya的1%。
如果我将其更改为/ bin / bash,我有多安全,是否会出现某些未安装bash的情况
bash
是一个POSIX Compliant shell,所以除非您需要/想要使用仅使用bash的语法,否则我不会随意将解释器行更改为#!/bin/bash
;它使用与#!/bin/sh
为什么所有的脚本都在 /etc/init.d使用/ bin / sh
因为如果管理员决定删除bash
,因为他最喜欢的shell是zsh
是否有一些东西会破裂 什么时候使用bash?
反过来说。如果你的脚本只有bash-only(非POSIX)语法,例如[[ ]]
或进程替换<( )
,那么如果你将解释器从#!/bin/bash
更改为{{1},这将会中断}}
答案 1 :(得分:2)
这取决于您申请的“交叉”平台。
如果它运行在“主要”Linux发行版上,请随意假设bash,但如果是较小的dists,或自定义安装bash不是给定的。事实上,如果你离开linux,我会更加谨慎地假设bash(并且就此而言,/ bin / bash位置也不是给定的。)
/etc/init.d脚本总是使用/ bin / sh的原因是因为它在大多数平台上都是给定的。
我不认为如果你使用bash会破坏东西,bash实现与sh相同的“功能”,但不是相反。因此,如果您不需要bash特定功能,请使用/ bin / sh
答案 2 :(得分:0)
假设安装的bash与
属于同一类别如果你保持可移植性(至少对POSIX shell),你将为将来节省很多工作。你会发现自己身处另一家公司,拥有不同的操作系统和不同的外壳。那么你对shell可移植性的了解将会带来很大的好处。
告诉自己和他人的口头禅是:“假设是所有搞砸的母亲。” : - )