【问题标题】:Unix shell code that is portable enough to run on all shells可移植性足以在所有 shell 上运行的 Unix shell 代码
【发布时间】:2010-10-25 06:42:05
【问题描述】:

任何人都可以告诉我编码指南以及 Unix shell 脚本的代码示例,使用这些代码可以在大多数当前的 shell 上运行,如 ksh、bash、csh 等。大多数时候我的一些代码编写因为 ksh 在普通 sh 上不起作用。我想让我的代码具有最大的可移植性。我的大部分代码将围绕 [ifs, elifs] 和 [whiles, fors] 并返回子 shell 的代码捕获(这将主要运行 SQL 脚本,我想为其获取一些返回代码,如处理的行数, SQL 脚本的返回码、错误码)。

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

【问题讨论】:

    标签: unix shell portability


    【解决方案1】:

    给自己一个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 中编写脚本”。

    【讨论】:

    【解决方案2】:

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

    您提到的所有要求功能都可以在sh 中找到。缺少的主要内容之一是对数组的支持,但这可以解决。

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

    【讨论】:

    • 只是检查一下,许多系统使用的从/bin/sh 到/bin/bash 的符号链接不会以某种方式改变bash 的行为,对吧?对于那些系统,您不会真正得到sh 的行为?
    • @Praxeolitic:根据documentation,“当作为'sh'调用时,Bash 在读取启动文件后进入 POSIX 模式。”链接中的部分列出了受 POSIX 模式影响的事物的列表。
    【解决方案3】:

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

    【讨论】:

    • 那是我的第一选择。商业原因……他们不同意使用 perl/python,他们也没有说出充分的理由……所以必须从 shell 开始,shell 也是一个不错的选择……不是吗……它也有很好的功能。
    • 是的,对于许多任务来说,shell 脚本使用起来非常简单高效。但是一旦涉及到更复杂的事情,特别是处理数据,这已经不是我的第一意见了。告诉他们这将花费更多,因为您需要更多时间:P
    • 这个选择不在我的手中......对不起朋友......但是我目前正在寻找好的可移植unix shell脚本遵循的指南......暂时......谢谢
    • 一个 bourne shell sh 应该安装在 每个 unix 系统上。有时 /bin/sh 只是指向功能更丰富但向后兼容的 shell 的符号链接。因此,您需要的是 Bourne shell e.G. 的脚本指南。这里ooblick.com/text/sh
    【解决方案4】:

    让自己Beginning Portable Shell scripting 看看作者要说什么。

    【讨论】:

      【解决方案5】:

      Bash Hackers Wiki 中有一些 shell 之间的可移植性讨论。看看,是否有帮助。

      【讨论】:

        【解决方案6】:

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

        为了测试最大的可移植性,您可以使用 bournesh。

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

        【讨论】:

        【解决方案7】:

        【讨论】:

          【解决方案8】:

          您可以使用Loker 检查语法是否符合 POSIX 标准。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-02-03
            • 2010-10-06
            • 1970-01-01
            • 1970-01-01
            • 2012-06-25
            • 1970-01-01
            • 2014-05-26
            • 2016-10-27
            相关资源
            最近更新 更多