Deb软件包维护脚本应该使用Bash还是Sh?

3
在Deb软件包维护脚本中,例如postinstall、prerm等,我们通常使用/bin/sh作为shell脚本解释器。然而,在不同的发行版或用户偏好下,/bin/sh可能是不同的。例如,Ubuntu将/bin/sh链接到/bin/dash,或者某些用户可能链接到/bin/tcsh。
我遇到了两种语法,如果用户将shell更改为tcsh,则可能失败。 1)set -e # tcsh无法理解此命令。 2)> /dev/null 2>&1 # 模糊重定向。
第一个想法是删除(1),并将(2)更改为>& /dev/null。然而,我发现在大多数维护脚本中,“set -e”行都会出现。
现在,我不确定应该 a)只修复所有问题并使用/bin/sh b)更改为使用/bin/bash c)忽略tcsh情况
有人能提供一些建议吗?
谢谢。 Jack

我认为Debian打包政策对此有指导方针,指出在这些位置使用set -e等是否有效,以及哪些shell可能是符合系统标准的/bin/sh。你看过了吗? - Etan Reisner
set -e 只是我发现的脚本中常见的一种方式或惯例。我查阅了有关打包 deb 的文档,但并没有说太多。然而,@Tonin 提供了一份很好的 Debian 政策文档,清晰地解释了脚本。 - Jack Yu
1个回答

8
Debian政策并不强制要求您使用/bin/sh作为shell,您可以使用任何其他正确命名的shell(使用Shebang),只要它在您尝试安装到的系统上可用(如果在preinst脚本中使用,则限制为提供的默认shell)。
但是Debian政策告诉您,无论实际上是什么,/bin/sh将始终实现SUSv3 Shell Command Language(即符合POSIX标准的shell)和一些其他功能。这是您可以依赖于您的维护者脚本。
在Debian上,/bin/sh在Lenny之前是/bin/bash。从Squeeze开始,它现在是/bin/dash。有关更多信息,请参见Debian wiki
在Debian或其任何衍生版本中,如果/bin/sh实际上链接到/bin/tcsh,那么这将是由本地管理员更改的本地设置。这可能不仅会破坏您的脚本,还会破坏许多其他脚本。Debian策略文件实际上告诉维护者避免使用cshtcsh作为脚本语言。
总之,我认为您不应该担心您的脚本与tcsh兼容,最佳实践是仅使用/bin/sh来满足所有打包需求。
有疑问时,请始终参考完整的Debian策略文件

谢谢这份文档!作为指南非常有用。 - Jack Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接