如何在会话之间启用 ksh 命令历史记录

Nik*_* R. 3 shell ksh command-history mksh

如果我开始kshmksh,我的向上箭头什么也不做:

$ ksh
$ ^[[A^[[A^[[A^[[A^[[A
Run Code Online (Sandbox Code Playgroud)

bash如果我开始bash并按下向上箭头,它会起作用。

$ bash
developer@1604:~$ ssh root@127.0.1.2 -p 2223
Run Code Online (Sandbox Code Playgroud)

如果我启动 ksh 或 mksh,我就没有历史记录。我什至设置了 $HISTFILE 变量,如果我启动一个新的 shell,仍然没有历史记录。

我该怎么办?Korn shell 不能记住会话之间的历史记录而 bash shell 可以吗?

如果我喜欢 Korn shell 并且想要一个更好、更广泛的历史记录,是否可以在 ksh 中使用该功能?

Kus*_*nda 7

不,这不是真的。

如果$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"
Run Code Online (Sandbox Code Playgroud)

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

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

export VISUAL="emacs"
export EDITOR="$VISUAL"
set -o emacs
Run Code Online (Sandbox Code Playgroud)

这已经在 OpenBSD 上用ksh93pdkshksh在 OpenBSD 上)进行了彻底的测试。我不使用mksh,但由于它是一个pdksh衍生物,我相信这也适用于该外壳。

请注意pdkshksh93(和bash不能共享历史文件,因为它们具有不同的历史格式。

如果您为bashand分离了初始化文件,这通常不是问题ksh,例如.bash_profileand .bashrcfor bashand.profile.kshrcfor ksh(with export ENV="$HOME/.kshrc"in .profile)。您可以ksh通过查看$KSH_VERSION(通常)来进一步区分各种实现。