如何防止Bash更改历史记录?


26

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

如何防止这种情况发生?


3
我喜欢这个问题的标题。您实际上可以更改历史记录并且在抱怨吗?你怎么了?!
丹尼尔·贝克

@Daniel:大声笑,是的。。。我的意思是,这好像是在改变我的过去。显然是荒谬的,过一会儿它变得可笑了。:\
Mehrdad

顺便说一句,如果您改用history-search-xxx,则行为有所不同。也许那是给你的东西?
丹尼尔·贝克

@Daniel:的确有用-非常感谢。但是,我还是想知道这个问题的答案,因为有时命令看起来彼此不太相似,而且这行不通。
Mehrdad

带有空提示的历史记录搜索与常规历史记录上一页/下一页一样,即显示所有条目。
丹尼尔·贝克

Answers:


17

您需要readline设置:

set revert-all-at-newline on

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

演示:

$ man bash
$ bind 'set revert-all-at-newline on'
$ man bsh # up arrow and edit
No manual entry for bsh
$ man bash # three up arrows

更多详细信息在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


你太棒了,这正是我所需要的。我不再想打我的显示器。:D +1000000(我希望)
Mehrdad

5

我输入:

ls /tmp

太好了 现在我不想进入

ls /temp 

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

 ls /temp

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

它由

export HISTCONTROL=ignoredups
export HISTCONTROL=ignoreboth

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

但是,也许您正在寻找一种解决方案,在该解决方案中,您将同时得到两个命令,未修改的旧命令和新命令。我的bash或设置版本的行为是这样的,但我不知道与您的有什么不同。


哈; 我一直以为不使用前导空格保存命令是一个错误。谢谢。:)
sarnold 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.