Shell

什麼shell使用readline?

  • February 15, 2022

我最近發布了一個關於我在bash,fish和shell 中觀察到的奇怪行為的問題,而, ,或shellzsh沒有表現出這種行為。事實證明,該行為是由庫的預設設置更改引起的,我通過將其添加到我的.tcsh``csh``ksh``dash``readline``set enable-bracketed-paste Off``~/.inputc

這讓我感到疑惑。為什麼這只影響我係統上特定的 shell 子集?不是所有的貝殼都用readline嗎?有什麼一般規則嗎?為什麼bash,zshfish改變了他們的行為而其他 shell 沒有?

readline``bash由同一作者一起實現,bash並在流行的 shell 中使用,大多數情況下只有bash.

readline庫是由 bash 產生的。bash1.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 中切換到它自己的版本。從README1.0 中的文件:

這是 zsh 的 v1.0 版本。我將由 Brian Fox 編寫的 GNU“readline”編輯器合併到 shell 中,只是為了讓我的生活暫時更輕鬆。我對其進行了很多更改,因此如果編輯器中有任何錯誤,則可能是我的錯。readline 不會成為 zsh 下一個版本的一部分。

基於 Ash 的 shell 通常使用 BSD 的 libedit(如果dash它通常在編譯時未啟用,因為dash它僅用於執行腳本,而不是作為互動式 shell)。

Byron Rakitzis的 Unix V10 / Plan9 rcshell 的複製讓您在編譯時可以選擇行編輯器:GNU readline、Simmule Turnereditline和 Gert-Jan Vons vrl。第一個版本只提供 readline。es並且akanga,基於rc提供readlinevs的選擇editline

busybox 有自己的行編輯器,由它的hushash基於的 shell 以及其他小程序(例如它的bcedfdisk.

readline很棒,因為它提供了一個行編輯器,可以(並且)在許多不同的工具中使用,提供一致性,但是,雖然它可能是功能最豐富的通用行編輯庫之一,但它相對有限你可以用它做什麼。它也是根據 GPL 許可的,因此只能用於根據GPL 許可或兼容的軟體。

包括 ksh、pdksh 和衍生工具、tcsh、zsh、fish 或 yash 在內的大多數 shell 都有自己的行編輯器,通常更高級。ksh 的行編輯器是在 1983 年前後編寫bash的,這就是 bash 的 readline 主要複製的介面。pdkshtcsh編輯器也早於 bash 和 readline。viPOSIX 指定基於 ksh 的 -style 行編輯器。emacsPOSIX 沒有指定這一點,因為 Richard Stallman(GNU 的主要作者,emacs順便還提出了“POSIX”名稱)反對它¹。

請注意,您有充分的理由希望在支持它的終端編輯器或行編輯器中啟用括號粘貼模式。請參閱:我如何保護自己免受這種剪貼板濫用?.


¹ 見*shell emacs 命令行編輯模式最終被省略了,因為很明顯 KornShell 版本和與 GNU 系統一起分發的編輯器在某些方面存在分歧。emacs 的作者要求要麼刪除 POSIX emacs 模式,要麼有大量未指定的條件。儘管 KornShell 作者同意考慮更改以使 shell 保持一致,但標准開發人員當時決定推遲規範。當時,假設後續草案會在可接受的定義上趨同,但這並沒有發生,而且似乎沒有這樣做的動力。在任何情況下,實現都可以根據使用者最熟悉的編輯器的確切模型免費提供額外的命令行編輯模式。”*在POSIX規範的 RATIONALE 部分sh

引用自:https://unix.stackexchange.com/questions/689401