Nik*_* R. 3 shell ksh command-history mksh
如果我开始ksh
或mksh
,我的向上箭头什么也不做:
$ 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 中使用该功能?
不,这不是真的。
如果$HISTFILE
是文件名,则会话历史记录将存储在该文件中。这在手册中有解释。shell 历史记录中记住的命令数量受 的值限制$HISTSIZE
。
我相信在执行每个命令后将历史记录刷新到文件中,而不是bash
在 shell 会话结束时将历史记录刷新到文件中。这可能取决于ksh
您使用的是哪种实现。
设置HISTFILE
为文件中的~/.profile
文件名(由登录 shell 读取)或指向的文件$ENV
(由交互式 shell 读取并具有默认值$HOME/.kshrc
in 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 上用ksh93
和pdksh
(ksh
在 OpenBSD 上)进行了彻底的测试。我不使用mksh
,但由于它是一个pdksh
衍生物,我相信这也适用于该外壳。
请注意,pdksh
和ksh93
(和bash
)不能共享历史文件,因为它们具有不同的历史格式。
如果您为bash
and分离了初始化文件,这通常不是问题ksh
,例如.bash_profile
and .bashrc
for bash
and.profile
和.kshrc
for ksh
(with export ENV="$HOME/.kshrc"
in .profile
)。您可以ksh
通过查看$KSH_VERSION
(通常)来进一步区分各种实现。
归档时间: |
|
查看次数: |
13425 次 |
最近记录: |