什麼shell使用readline?
我最近發布了一個關於我在
bash
,fish
和shell 中觀察到的奇怪行為的問題,而, ,或shellzsh
沒有表現出這種行為。事實證明,該行為是由庫的預設設置更改引起的,我通過將其添加到我的.tcsh``csh``ksh``dash``readline``set enable-bracketed-paste Off``~/.inputc
這讓我感到疑惑。為什麼這只影響我係統上特定的 shell 子集?不是所有的貝殼都用
readline
嗎?有什麼一般規則嗎?為什麼bash
,zsh
並fish
改變了他們的行為而其他 shell 沒有?
readline``bash
由同一作者一起實現,bash
並在流行的 shell 中使用,大多數情況下只有bash
.該
readline
庫是由 bash 產生的。bash
1.02的ChangeLog
文件有:Wed Jun 28 16:51:42 1989 Brian Fox (bfox at aurel) * New directory: LIB contains readline and history stuff, and is Make-able on its own. Also contains its own ChangeLog * history.c: removed shell dependent stuff, made into standalone library. Tue Jun 27 13:05:54 1989 Brian Fox (bfox at aurel) * readline.c: removed shell dependent stuff. * New file: bashline.c contains all of the shell specific readline material in an attempt to begin using the readline stuff as a library. Mon Jun 26 13:35:16 1989 Brian Fox (bfox at aurel) [...] * readline.c, jobs.c Make commands that do not complete sucessfully restore the tty state to whatever it was before the command was executed.
zsh
在 1990 年的第一個 1.0 版本中使用了 ’s readline 的修改版本,bash
因為它自己的行編輯器還沒有準備好,但在 1991 年四個月後在 2.0 中切換到它自己的版本。從README
1.0 中的文件:這是 zsh 的 v1.0 版本。我將由 Brian Fox 編寫的 GNU“readline”編輯器合併到 shell 中,只是為了讓我的生活暫時更輕鬆。我對其進行了很多更改,因此如果編輯器中有任何錯誤,則可能是我的錯。readline 不會成為 zsh 下一個版本的一部分。
基於 Ash 的 shell 通常使用 BSD 的 libedit(如果
dash
它通常在編譯時未啟用,因為dash
它僅用於執行腳本,而不是作為互動式 shell)。Byron Rakitzis的 Unix V10 / Plan9
rc
shell 的複製讓您在編譯時可以選擇行編輯器:GNUreadline
、Simmule Turnereditline
和 Gert-Jan Vonsvrl
。第一個版本只提供 readline。es
並且akanga
,基於rc
提供readline
vs的選擇editline
。busybox 有自己的行編輯器,由它的
hush
和ash
基於的 shell 以及其他小程序(例如它的bc
、ed
、fdisk
.
readline
很棒,因為它提供了一個行編輯器,可以(並且是)在許多不同的工具中使用,提供一致性,但是,雖然它可能是功能最豐富的通用行編輯庫之一,但它相對有限你可以用它做什麼。它也是根據 GPL 許可的,因此只能用於根據GPL 許可或兼容的軟體。包括 ksh、pdksh 和衍生工具、tcsh、zsh、fish 或 yash 在內的大多數 shell 都有自己的行編輯器,通常更高級。ksh 的行編輯器是在 1983 年前後編寫
bash
的,這就是 bash 的 readline 主要複製的介面。pdksh
行tcsh
編輯器也早於 bash 和 readline。vi
POSIX 指定基於 ksh 的 -style 行編輯器。emacs
POSIX 沒有指定這一點,因為 Richard Stallman(GNU 的主要作者,emacs
順便還提出了“POSIX”名稱)反對它¹。請注意,您有充分的理由希望在支持它的終端編輯器或行編輯器中啟用括號粘貼模式。請參閱:我如何保護自己免受這種剪貼板濫用?.
¹ 見*shell emacs 命令行編輯模式最終被省略了,因為很明顯 KornShell 版本和與 GNU 系統一起分發的編輯器在某些方面存在分歧。emacs 的作者要求要麼刪除 POSIX emacs 模式,要麼有大量未指定的條件。儘管 KornShell 作者同意考慮更改以使 shell 保持一致,但標准開發人員當時決定推遲規範。當時,假設後續草案會在可接受的定義上趨同,但這並沒有發生,而且似乎沒有這樣做的動力。在任何情況下,實現都可以根據使用者最熟悉的編輯器的確切模型免費提供額外的命令行編輯模式。”*在POSIX規範的 RATIONALE 部分
sh
。