Deb 包维护者脚本应该使用 Bash 还是 Sh

Posted

技术标签:

【中文标题】Deb 包维护者脚本应该使用 Bash 还是 Sh【英文标题】:Should Deb package maintainer script use Bash or Sh 【发布时间】:2016-03-15 13:34:21 【问题描述】:

在 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 大小写

谁能提供一些建议?

谢谢。 杰克

【问题讨论】:

我认为 debian 打包政策有这方面的指导方针,表明在这些位置使用 set -e 等是否有效,以及在符合标准的系统上哪些 shell 可能是 /bin/sh。你看过吗? set -e 只是我发现的脚本中的一种常见方式或做法。我看过有关打包 deb 的文档,但并没有说太多。但是,@Tonin 确实提供了一份关于 Debian 政策的好文档,清楚地解释了脚本。 【参考方案1】:

Debian policy 不会强迫您使用/bin/sh 作为外壳,只要您正确命名它(使用Shebang),您可以使用任何其他外壳,并且它在您尝试安装到的系统上可用(如果您在 preinst 脚本中使用它,则会限制您使用默认提供的 shell)。

但 Debian 政策告诉您,/bin/sh,不管它是什么,总是会实现 SUSv3 Shell 命令语言(即:符合 POSIX 的 shell)和一些附加功能。这就是你的维护者脚本可以依赖的东西。

在 Debian 上,/bin/sh/bin/bash,直到 Lenny。来自 Squeeze,现在是 /bin/dash。请参阅Debian wiki for more information。

在 Debian 或任何衍生产品上,如果 /bin/sh 实际上链接到 /bin/tcsh,它将是由本地管理员更改的本地设置。这可能不仅会破坏您的脚本,还会破坏许多其他脚本。 Debian 政策文件实际上告诉维护者避免将cshtcsh 作为脚本语言。

总之,我认为您不应该担心您的脚本与tcsh 兼容,最佳做法是仅使用/bin/sh 来满足您的所有打包需求。

如有疑问,请始终参考完整的Debian policy document。

【讨论】:

感谢这份文件!作为公会路线非常有用。

以上是关于Deb 包维护者脚本应该使用 Bash 还是 Sh的主要内容,如果未能解决你的问题,请参考以下文章

bash shell 脚本:条件字符串连接

sh Python Dash包Bash脚本

sh 一个简单的bash脚本,用于在Unix / Linux上使用ping观察数据包丢失

sh Bash脚本,用于检查网站是启动还是关闭,并通过电子邮件发送通知

Linux bash/sh/shell编程中的if语句应该怎么写

Bash 脚本 set 命令教程