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 政策文件实际上告诉维护者避免将csh
和tcsh
作为脚本语言。
总之,我认为您不应该担心您的脚本与tcsh
兼容,最佳做法是仅使用/bin/sh
来满足您的所有打包需求。
如有疑问,请始终参考完整的Debian policy document。
【讨论】:
感谢这份文件!作为公会路线非常有用。以上是关于Deb 包维护者脚本应该使用 Bash 还是 Sh的主要内容,如果未能解决你的问题,请参考以下文章
sh 一个简单的bash脚本,用于在Unix / Linux上使用ping观察数据包丢失
sh Bash脚本,用于检查网站是启动还是关闭,并通过电子邮件发送通知