sed命令每个操作系统之间的行为差​​异及其含义

时间:2011-11-06 17:43:53

标签: shell unix command-line posix

我在sed命令的工作行为之间遇到了一个奇怪但有效的区别。坦率地说,这对我来说是一个非常大的惊喜。

现在让我们看一下SUSE Linux和HP(IA64)sed的手册页。


SUSE Linux:

  

说明          Sed是一个流编辑器。流编辑器用于执行基本文本          输入流上的转换(文件或来自管道的输入)。          虽然在某些方面类似于允许脚本编辑的编辑器          (例如ed),sed通过只对输入进行一次传递来工作,并且          因此更有效率。但它是sed过滤文本的能力          在管道中特别区别于其他类型的          编辑。


HP IA64:

  

说明   sed将命名的文本文件(标准输入默认值)复制到标准输出,根据包含最多100个命令的脚本进行编辑。仅处理完整的输入行。 文件末尾的任何输入文字都不会被新行字符终止

突出显示的文字似乎是工作行为的主要差异。因此,在移植期间,我的所有脚本都在HP-UX IA64计算机中启动失败。

问题:
一个。是否有任何基础标准迫使每个供应商基本符合实施?

湾如果有一些命令确认而其他命令无法确认,任何人都可以发布符合标准的列表。

℃。现在我有很多这样的命令用作我的项目脚本的一部分。检查/避免此类错误的最佳方法是什么 - 除了测试所有方案的每个命令外?

基本上在这种情况下,我将面临确认软件在供应商平台上适用于所有场景的问题。

1 个答案:

答案 0 :(得分:3)

从POSIX的角度来看,在最后一个换行符后忽略文本的HP-UX行为没有任何问题。关键在于应用程序要求sed的输入文件是文本文件。这意味着可能没有任何NUL字节,行长度限制为{LINE_MAX}(包括换行符),如果文件不为空,则文件必须以换行符结束(因为行必须以换行符结尾)。如果应用程序使用非文本文件的输入文件调用sed,则行为未定义。

针对这种情况的其他常见行为包括使用不以换行符结尾的“行”运行脚本(GNU sed)并添加最后一行(如果缺少一行)(FreeBSD sed)。

100个命令的限制似乎更值得怀疑;我没有看到允许这样限制的句子。

POSIX.1-2008参考:XBD 3.205行,XBD 3.394文本文件,XCU 4实用程序sed。