如何防止 Bash 改变历史?

use*_*686 28 bash history

如果我按键盘上的向上或向下箭头,然后修改我的历史记录中的某些内容,它就会永远改变。即使我按 Ctrl-C 然后尝试再次调出它,它仍然会改变——我已经在我的历史记录中丢失了那个条目。

我怎样才能防止这种情况发生?

sar*_*old 20

你想要 readline 设置:

set revert-all-at-newline on
Run Code Online (Sandbox Code Playgroud)

你可以把它放进去~/.inputrc(见下面的注释),或者把bind 'revert-all-at-newline on'你的~/.bashrc.

演示:

set revert-all-at-newline on
Run Code Online (Sandbox Code Playgroud)

更多详细信息在Bash 联机帮助页中

revert-all-at-newline

如果设置为 ' on',Readline 将在执行 accept-line 时在返回之前撤消对历史行的所有更改。默认情况下,历史行可以被修改并在调用 readline 时保留单个撤消列表。默认值为“ off”。


笔记:

如果~/.inputrc为了设置而创建了一个新文件revert-all-at-newline,请注意 bash 将使用该文件中的 readline 设置,而不是该文件中可能存在任何设置/etc/inputrc。也就是说, 中指定的任何设置/etc/inputrc将不再有效。因此,如果/etc/inputrc文件存在,最好从~/.inputrc以下行开始:

$include /etc/inputrc


use*_*own 5

我输入:

ls /tmp
Run Code Online (Sandbox Code Playgroud)

- 精彩的。现在我不想进入

ls /temp 
Run Code Online (Sandbox Code Playgroud)

并且可以防止它进入历史记录,因此如果我以空白开始命令,则可以防止它覆盖 ls /tmp:

 ls /temp
Run Code Online (Sandbox Code Playgroud)

很难看到,但如果你知道......

它由控制

export HISTCONTROL=ignoredups
export HISTCONTROL=ignoreboth
Run Code Online (Sandbox Code Playgroud)

ignoreups 只忽略重复的命令,ignoreboth 忽略行首的空格,这对于隐藏其他未隐藏的密码很有用。

但也许您正在寻找一种解决方案,在那里您以两个命令结束,未修改的旧命令和新命令。我的 bash 或设置版本的行为是这样的,但我不知道,你的有什么不同。