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

Enj*_*ing 3 unix shell portability

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

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

Jon*_*ler 13

获取第7版Unix程序员手册(第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脚本基本上是不可能的.结论"你不应该在C shell中编写脚本" 有很强的论据.