在这个上下文我遇到过一种情况,ed file < script
打印并退出时出现错误 2,而一次?
输入或粘贴命令效果很好。script
即使有一个 shell 进程一次通过一行传递文件,sleep
中间有一个行也能正常工作。因此,在我看来,ed
如果命令出现在不方便的时间,我的版本(MacOS 10.12 中的版本)就会出现问题。
为什么 ed 不简单地避免读取标准输入,直到它准备好处理它收到的任何命令?或者我误解了情况?
错误消息
?
没有太大帮助。h
根据手册页,在交互式会话中,我可以随后键入以获取错误消息。但如果来自非 TTY 的输入,它会立即退出。在这种情况下,是否也有某种方法可以获取错误消息?这是一个已知的问题?如果是这样,是否有任何建议的解决方法,而不是缓慢传递命令? ed 的哪些版本会受到影响?
答案1
该问题可能是由脚本中的回车符引起的ed
。复制和粘贴一段文本不会将它们传输到正在运行的ed
进程,但如果它们位于脚本文件中,那么我可以理解这ed
会造成混淆。
GNUed
退出时退出状态为 2“表示输入文件已损坏或无效”,这支持推测它可能是 DOS 格式的脚本文件。但是, ed
macOS 上的默认设置是 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
命令“太快”而导致的问题。