我想知道 Gnu Ed 和 BSD Unix 系统附带的 Ed 版本之间有什么功能差异吗?我目前在 Debian 10 上使用 Gnu Ed 1.17,但发现了这个页面:
手册页似乎有所不同:
答案1
我只能访问三个当前的 ed
实施:
- OpenBSD 7.0
ed
(预计其行为类似于ed
NetBSD、FreeBSD 和 macOS,但我尚未对此进行彻底测试)。 - GNU
ed
1.14.2 和 1.16。 - 计划 9
ed
来自plan9port-20210323
.
我试图总结下面这些之间的差异,并且我还尝试添加一些“符合 POSIX 标准ed
”的预期行为(按照什么进行)POSIX 规范说)。
仅提到了我在 U&L 上的相关问题/答案中遇到的差异ed
,因此我没有尝试对手册等进行文献研究来查找所有内容。例如,大多数ed
实现通过额外的命令和/或命令行选项提供对 POSIXed
标准的扩展,这在其手册中应该是不言而喻的,并且 POSIXed
规范还提到了一些从未标准化的命令。
支持的正则表达式变体部分取决于系统的正则表达式库。这意味着 GNU 系统上的表达式\`
将匹配行的开头(就像^
GNU ed
(info-) 手册中所示),而ed
OpenBSD 系统上的 GNU 将无法使用它。所以这个我就不多说了。
这些是其他一些差异:
#
作为评论字符。- GNU:
#
是一个注释命令。 - BSD:
#
不是有效命令。 - 计划 9:像 BSD 一样。
- POSIX:像 BSD。
- GNU:
破坏未保存工作的行为。
- GNU:
e
、e !
、q
如果缓冲区未保存,则第一次尝试总是失败。 - BSD:与 GNU 类似,但使用
-s
会禁用警告。 - 计划 9:像 GNU 一样。
- POSIX:就像 GNU 一样。
- GNU:
退出状态(这有点难以彻底测试)。
- GNU:如果最后一个命令导致错误,则以非零退出状态终止。
- BSD:大多数错误仅导致非零终止
-s
。 - 计划 9:似乎永远不会以非零退出状态终止。
- POSIX:退出状态为零的终止意味着“成功完成,没有任何文件或命令错误”。
该
s///
命令,但只有第一个/
.- GNU:
s/RE
是一个错误。 - BSD:
s/RE
行为类似于s/RE/
,与 相同s/RE//p
,即将RE
与正则表达式匹配的子字符串替换为空,并打印修改后的行。 - 计划 9:像 BSD 一样。
- POSIX:就像 GNU 一样。
- GNU:
用作
^
地址。- GNU:
^
是一个无效地址。 - BSD:
^
寻址前一行,就像-
. - 计划 9:像 BSD 一样。
- POSIX:允许
^
与-
.
- GNU:
组合打印命令
p
、l
和n
(如nl
),并在执行此操作时重复命令(如nlnl
或pnnn
)。- GNU:允许组合打印命令。不允许重复命令(尽管允许使用
pp
、nn
、 和 ,ll
因为标准允许将p
、n
、 或添加l
到除e
、E
、f
、q
、Q
、 、r
、w
或之外的命令中!
)。 - BSD:允许组合打印命令。允许重复命令。
- 方案 9:允许三个命令中的两个命令的组合(不是
nlp
)。不允许重复命令。 - POSIX:组合打印命令的效果是“未指定的”。
- GNU:允许组合打印命令。不允许重复命令(尽管允许使用
收到 HUP 信号后,当前编辑缓冲区将保存在
ed.hup
当前目录中调用的文件中。如果失败,缓冲区将被写入$HOME/ed.hup
。如果这些名称已经存在会发生什么?- GNU:如果当前目录中的文件
ed.hup
是常规文件并且由当前用户拥有,则该文件将被覆盖。否则,$HOME/ed.hup
如果该文件是当前用户拥有的常规文件,则该文件将被覆盖。否则,缓冲区就会丢失。 - BSD:与 GNU 类似,但当前缓冲区也可在名称与 . 匹配的临时文件中使用
/tmp/ed.*
。 - 计划 9:像 GNU 一样。
- POSIX:就像 GNU 一样。
- GNU:如果当前目录中的文件