Ed 脚本仅在缓慢键入时才有效

Ed 脚本仅在缓慢键入时才有效

这个上下文我遇到过一种情况,ed file < script打印并退出时出现错误 2,而一次?输入或粘贴命令效果很好。script即使有一个 shell 进程一次通过一行传递文件,sleep中间有一个行也能正常工作。因此,在我看来,ed如果命令出现在不方便的时间,我的版本(MacOS 10.12 中的版本)就会出现问题。

  1. 为什么 ed 不简单地避免读取标准输入,直到它准备好处理它收到的任何命令?或者我误解了情况?

  2. 错误消息?没有太大帮助。h根据手册页,在交互式会话中,我可以随后键入以获取错误消息。但如果来自非 TTY 的输入,它会立即退出。在这种情况下,是否也有某种方法可以获取错误消息?

  3. 这是一个已知的问题?如果是这样,是否有任何建议的解决方法,而不是缓慢传递命令? ed 的哪些版本会受到影响?

答案1

该问题可能是由脚本中的回车符引起的ed。复制和粘贴一段文本不会将它们传输到正在运行的ed进程,但如果它们位于脚本文件中,那么我可以理解这ed会造成混淆。

GNUed退出时退出状态为 2“表示输入文件已损坏或无效”,这支持推测它可能是 DOS 格式的脚本文件。但是, edmacOS 上的默认设置是 BSD ed,并且手册中没有正确记录退出代码。查看(OpenBSD)源代码,看起来导致此退出代码的大多数错误确实与脚本文件的读取有关。

要删除\r每个换行符之前的内容(将执行就地编辑):

printf '%s\n' ',s/\r$//' 'wq' | ed -s file

例如,在 Windows 编辑器中或在将文件保存为 DOS 格式文本文件的任何编辑器中编写脚本时,会出现回车符。

问题1:我很确定是这样。

问题 2 与生成的相当简洁的诊断消息有关ed?,大多数时候)。如果您通过调用该H函数来启动编辑脚本,则任何错误都将是详细的而不是普通的?,就像您h在错误后键入一样。如果每行末尾有回车符,这将无济于事,因为这会阻止ed识别H为有效命令。

问题 3:我在 OpenBSD 上使用过 GNU ed(1.14.2) 和 BSD ed,并且没有看到由于输入ed命令“太快”而导致的问题。

相关内容