我想开发可移植/bin/sh
脚本,但我的环境链接/bin/sh
到/bin/bash
.即使在--posix
模式下运行,/bin/bash
仍然可以处理一些不可移植的功能,例如[[
和$()
。我(现在)意识到这些是不可移植的,但我不知道我正在使用的其他语法并不总是可用。bash
扩展
是否有一个免费的实现,/bin/sh
它拒绝不可移植的构造,我可以用它来测试我的脚本是否不使用任何bash
-isms?
答案1
bosh
POSIXified Bourne Shell怎么样:
它仍然有一些扩展,但它们有很好的文档记录:
http://schilytools.sourceforge.net/man/man1/bosh.1.html
它比它快一点dash
,比它慢一点,ksh93
这使它成为第二快的 shell。
请注意,dash
不支持多字节字符,因此仅对小型嵌入式系统有用。
顺便说一句:bosh
允许细粒度配置行为。 Solaris-10 兼容osh
版本是从与bosh
.看一下Makefile
。当我有时间时,我可能会看看是否可以Makefile
为此目的创建一个预配置。
更新:在过去的几天里,我创建了“bosh”的新编译变体,并将其命名为“pbosh”。它将包含在下一个计划的 schilytools 快照中,该快照很可能于 2018 年 6 月 29 日或 7 月 2 日发布。
“pbosh”是一个旨在测试 shell 脚本可移植性的 shell。
它没有实现 POSIX 上的扩展,因此如果使用超出 POSIX 标准的 shell 功能,则会失败。
请记住,与“pbosh”一起使用的脚本仍然可能在其他 shell 中失败,因为 POSIX 有一些未指定的功能。一个例子是管道的创建方式。 “pbosh”实现了优化方法,并且如果这是 shell 内置程序,则从 shell 进程内的管道运行最右边的程序。因此,很可能所有与“pbosh”一起工作的管道也将与“ksh93”一起工作,但仍然可能会因“bash”而失败。
如果您想检查您的脚本是否可移植到 Solaris 10 上存在的 SVr4 Bourne Shell,建议检查它是否也可以与 schilytools 中名为“osh”的另一个“bosh”编译变体一起运行。这是 Solaris 10 SVr5 Bourne Shell 的便携式版本。
注意:为了使“pbosh”发挥一半作用,默认情况下不会禁用持久别名。您还可以使用其他 shell 测试您的脚本,或者编辑 Makefile 并使用以下命令注释掉以下行:
CPPOPTS += -DDO_GLOBALALIASES # Include persistent aliases in ~/.globals
CPPOPTS += -DDO_LOCALALIASES # Include persistent aliases in .locals
然后调用“make clean all”来重新编译“pbosh”并禁用持久别名。