Shell

如何在會話之間啟用 ksh 命令歷史記錄

  • September 27, 2018

如果我開始kshor mksh,我的向上箭頭什麼也不做:

$ ksh
$ ^[[A^[[A^[[A^[[A^[[A

bash如果我開始bash並按下向上箭頭,它就會起作用。

$ bash
developer@1604:~$ ssh root@127.0.1.2 -p 2223

如果我啟動 ksh 或 mksh,我沒有歷史記錄。我什至設置了 $HISTFILE 變數,如果我啟動一個新的 shell,仍然沒有歷史記錄。

我能做些什麼呢?Korn shell 不能記住會話之間的歷史,而 bash shell 可以嗎?

如果我喜歡 Korn shell 並且想要一個更好、更廣泛的歷史,是否可以將該功能與 ksh 一起使用?

不,這不是真的。

如果$HISTFILE是文件名,則會話歷史記錄將儲存在該文件中。這在手冊中有說明。在 shell 歷史記錄中記住的命令數量受$HISTSIZE.

我相信在執行每個命令後將歷史記錄刷新到文件中,而不是bash在 shell 會話結束時將歷史記錄刷新到文件中。這可能取決於ksh您使用的是哪種實現。

設置HISTFILE為文件中的~/.profile文件名(由登錄 shell 讀取)或指向的文件$ENV(由互動式 shell 讀取,預設值為$HOME/.kshrcin ksh93)。$HISTSIZE預設情況下為 500 或 512 或類似的值,具體取決於ksh您使用的實現。這些變數都不需要導出。在執行此操作之前,歷史文件不需要存在。


在評論中您提到某些 Emacs 移動和命令行編輯鍵不起作用。這是因為 shell 不是 Emacs 編輯模式。將變數EDITOR(或VISUAL)設置為emacs或用於set -o emacs啟用 Emacs 命令行編輯模式。這在手冊中也有說明。這些變數也不需要導出,除非您希望 shell 以外的其他程序使用它們。


概括:

在您的$HOME/.profile文件中:

export ENV="$HOME/.kshrc"

在您的$HOME/.kshrc文件中:

HISTFILE="$HOME/.ksh_history"
HISTSIZE=5000

export VISUAL="emacs"
export EDITOR="$VISUAL"
set -o emacs

這已經在 OpenBSD 上用ksh93pdkshksh在 OpenBSD 上)進行了徹底的測試。我不使用mksh,但由於它是pdksh衍生物,我相信這也適用於該外殼。

注意pdkshand ksh93(and bash)不能共享歷史文件,因為它們有不同的歷史格式。

bash如果您為and分開了初始化文件ksh,例如.bash_profileand .bashrcfor bashand and .profileand .kshrcfor ksh(with export ENV="$HOME/.kshrc"in .profile) ,這通常不是問題。ksh您可以通過查看$KSH_VERSION(通常)進一步區分各種實現。

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