Unix shell代码,可移植到足以在所有shell上运行

时间:2010-10-25 06:42:06

标签: unix shell portability

任何人都可以让我知道编码指南以及Unix shell脚本的代码示例,使用哪些代码可以在大多数当前的shell上运行,如ksh,bash,csh等。大多数时候我的一些代码写的因为ksh不适用于普通的sh。我想让我的代码最大可移植。我的大多数代码都围绕[ifs,elifs]和[whiles,fors]并返回子shell的代码捕获(主要是运行SQL脚本,我想获得一些返回代码,如处理的行数,返回代码,SQL脚本的错误代码。)

还有谁能让我知道哪些shell特定代码可以轻松移植到其他shell?有人能指出我正确的教程和/或示例代码吗?

8 个答案:

答案 0 :(得分:13)

给自己一个7th Edition Unix Programmer's Manual (Vol 1)并编程到那里描述的(Bourne)shell表示法。如果能找到合适的手册,您实际上可以升级到System V(Bourne)shell;它有一些额外的功能,比如第7版shell没有的功能,它们基本上可以在任何地方使用。 (这是一个非常保守的立场 - 但它会给你最大的便携性。)

另一个问题是选择您使用的命令以及您对这些命令使用的选项。例如,GNU grep有许多其他地方没有的有用选项。 GNU sed类似地具有其他地方没有的扩展。如果你编写shell脚本来使用这些扩展,那么你的代码将是不可移植的,即使shell都能正确理解语法。

我建议您了解POSIX标准所说的便携性。大多数系统通常都支持大多数POSIX功能,但每个系统通常会添加一些并非总是可用的额外选项和功能。请注意,POSIX shell确实具有一些功能,特别是$(...)命令替换代替您不在原始Bourne shell中的反向标记。你必须决定更现代的符号所带来的清晰度是否值得(名义上)可移植性的损失。

此外,Autoconf shell指南专注于最大可移植性。但是,结果是一个相当笨拙的shell脚本版本,不仅仅是因为它必须与m4宏处理器互通,这会导致一些额外的约束。


请注意,编写可与Bourne / Korn / POSIX shell系列和C Shell系列一起使用的可移植shell脚本基本上是不可能的。有strong arguments来总结“你不应该在C shell中编写脚本”。

答案 1 :(得分:4)

可移植性的简短答案是为最低公分母(即sh)编写脚本,并避免使用具有不兼容语法和serious limitations的C shell。 Bourne shell应该是普遍可用的,大多数系统启动和管理脚本都是为它编写的。

sh中提供了您作为要求提及的所有功能。缺少的一个主要问题是对数组的支持,但这可以解决。

要记住的一件事是shell脚本的大部分功能都是由可从任何shell访问的外部实用程序提供的。

答案 2 :(得分:2)

为什么不在perl或python中编写脚本?

答案 3 :(得分:1)

获取自己Beginning Portable Shell scripting并查看作者要说的内容。

答案 4 :(得分:0)

Bash Hackers Wiki中的shell之间存在一些可移植性的讨论。如果有帮助的话,请参阅。

答案 5 :(得分:0)

还有Steve Parker的Bourne / Bash在线shell脚本教程或者诸如Chris F.A.Jillnson的“Shell Scripting Recipes:A Problem-Solution Approach”等书籍。

要测试最大可移植性,您可以使用bournesh。

http://freshmeat.net/projects/bournesh/

答案 6 :(得分:0)

答案 7 :(得分:0)

您可以使用Loker检查与POSIX标准的语法一致性。