我在sed
命令的工作行为之间遇到了一个奇怪但有效的区别。坦率地说,这对我来说是一个非常大的惊喜。
现在让我们看一下SUSE Linux和HP(IA64)sed
的手册页。
SUSE Linux:
说明 Sed是一个流编辑器。流编辑器用于执行基本文本 输入流上的转换(文件或来自管道的输入)。 虽然在某些方面类似于允许脚本编辑的编辑器 (例如ed),sed通过只对输入进行一次传递来工作,并且 因此更有效率。但它是sed过滤文本的能力 在管道中特别区别于其他类型的 编辑。
HP IA64:
说明 sed将命名的文本文件(标准输入默认值)复制到标准输出,根据包含最多100个命令的脚本进行编辑。仅处理完整的输入行。 文件末尾的任何输入文字都不会被新行字符终止
突出显示的文字似乎是工作行为的主要差异。因此,在移植期间,我的所有脚本都在HP-UX IA64计算机中启动失败。
问题:
一个。是否有任何基础标准迫使每个供应商基本符合实施?
湾如果有一些命令确认而其他命令无法确认,任何人都可以发布符合标准的列表。
℃。现在我有很多这样的命令用作我的项目脚本的一部分。检查/避免此类错误的最佳方法是什么 - 除了测试所有方案的每个命令外?
基本上在这种情况下,我将面临确认软件在供应商平台上适用于所有场景的问题。
答案 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。