Ed
Gnu Ed 和 Unix 附帶的 Ed 版本有什麼區別?
我想知道 Gnu Ed 和 BSD Unix 系統附帶的 Ed 版本之間是否有任何功能差異?我目前在 Debian 10 上使用 Gnu Ed 1.17,但發現了這個頁面:
手冊頁似乎有所不同:
我只能訪問三個目前的
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
實現通過額外的命令和/或命令行選項提供對 POSIX 標準的擴展,ed
這在其手冊中應該是不言而喻的,並且 POSIXed
規範還提到了一些從未標準化的命令。支持的正則表達式變體部分取決於系統的正則表達式庫。這意味著 GNU 系統上的表達式將匹配 GNU (info-) 手冊中所示
\``的行首(就像),而OpenBSD 系統上的 GNU 將無法使用它。所以我不會多說這個。
^ed
ed`這些是其他一些差異:
#
作為評論角色。
- GNU:
#
是一個註釋命令。- BSD:
#
不是一個有效的命令。- 計劃 9:像 BSD。
- POSIX:就像 BSD。
破壞未保存工作的行為。
- GNU:
e
,e !
,q
如果緩衝區未保存,第一次嘗試總是失敗。- BSD:與 GNU 類似,但使用
-s
會禁用警告。- 計劃 9:像 GNU。
- POSIX:就像 GNU。
退出狀態(這有點難以徹底測試)。
- GNU:如果最後一個命令導致錯誤,則以非零退出狀態終止。
- BSD:大多數錯誤僅在
-s
.- 計劃 9:似乎永遠不會以非零退出狀態終止。
- POSIX:以零退出狀態終止意味著“成功完成,沒有任何文件或命令錯誤”。
s///
命令,但只有第一個/
.
- GNU:
s/RE
是一個錯誤。- BSD:
s/RE
行為類似於s/RE/
,與 相同s/RE//p
,即它將匹配正則表達式的子字元串替換為空RE
,並列印修改後的行。- 計劃 9:像 BSD。
- POSIX:就像 GNU。
用作
^
地址。
- GNU:
^
是一個無效地址。- BSD:
^
地址上一行,就像-
.- 計劃 9:像 BSD。
- POSIX:允許
^
與-
.組合列印命令
p
、l
和n
(如nl
),並在執行此操作時重複命令(如nlnl
或pnnn
)。
- GNU:允許組合列印命令。不允許重複的命令(儘管
pp
,nn
和ll
是允許的,因為標准允許將p
,n
, or添加l
到除e
,E
,f
,q
,Q
,r
,w
, or之外的命令中!
)。- BSD:允許組合列印命令。允許重複命令。
- 計劃 9:允許三個命令中的兩個命令的組合(不允許
nlp
)。不允許重複命令。- POSIX:組合列印命令的效果是“未指定的”。
接收到 HUP 信號後,目前編輯緩衝區保存在
ed.hup
目前目錄中呼叫的文件中。如果失敗,則將緩衝區寫入$HOME/ed.hup
. 如果這些名稱已經存在會怎樣?
- GNU:如果
ed.hup
目前目錄中的文件是正常文件並且歸目前使用者所有,則該文件將被覆蓋。否則,$HOME/ed.hup
如果該文件是目前使用者擁有的正常文件,則該文件將被覆蓋。否則,緩衝區將失去。- BSD:與 GNU 類似,但目前緩衝區也可以在名稱匹配的臨時文件中使用
/tmp/ed.*
。- 計劃 9:像 GNU。
- POSIX:就像 GNU。