如何在會話之間啟用 ksh 命令歷史記錄
如果我開始
ksh
ormksh
,我的向上箭頭什麼也不做:$ 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/.kshrc
inksh93
)。$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 上用
ksh93
和pdksh
(ksh
在 OpenBSD 上)進行了徹底的測試。我不使用mksh
,但由於它是pdksh
衍生物,我相信這也適用於該外殼。注意
pdksh
andksh93
(andbash
)不能共享歷史文件,因為它們有不同的歷史格式。
bash
如果您為and分開了初始化文件ksh
,例如.bash_profile
and.bashrc
forbash
and and.profile
and.kshrc
forksh
(withexport ENV="$HOME/.kshrc"
in.profile
) ,這通常不是問題。ksh
您可以通過查看$KSH_VERSION
(通常)進一步區分各種實現。