24

If I press the Up or Down arrows on my keyboard and then modify something from my history, it's changed forever. Even if I press Ctrl-C and then try to bring it up again, it's still changed -- I've lost that entry in my history.

How can I prevent this from happening?

migrated from stackoverflow.com Jun 25 '11 at 22:19

This question came from our site for professional and enthusiast programmers.

  • 3
    I love the title of this question. You can actually alter history and you're complaining? What is wrong with you?! – Daniel Beck Jun 25 '11 at 22:24
  • @Daniel: Lol, yeah... I mean, it's as if I'm changing my past. Clearly nonsensical, and it gets ridiculously annoying after a while. :\ – Mehrdad Jun 25 '11 at 22:25
  • Btw, if you use history-search-xxx instead, the behavior's different. Maybe that's something for you? – Daniel Beck Jun 25 '11 at 22:29
  • @Daniel: That's indeed useful -- thanks a lot. But still, I'd like to know the answer to this question, because sometimes the commands don't look so much like each other, and that doesn't work. – Mehrdad Jun 25 '11 at 22:34
  • history-search with an empty prompt works just like regular history prev/next, i.e. displaying all entries. – Daniel Beck Jun 25 '11 at 22:35
14

You want the readline setting:

set revert-all-at-newline on

You can either put it in ~/.inputrc (see note below), or put bind 'revert-all-at-newline on' in your ~/.bashrc.

Demo:

$ 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

Further details are in the Bash manpage:

revert-all-at-newline

If set to ‘on’, Readline will undo all changes to history lines before returning when accept-line is executed. By default, history lines may be modified and retain individual undo lists across calls to readline. The default is ‘off’.


Note:

If a new ~/.inputrc file is created for the purpose of setting revert-all-at-newline, be aware that bash will use the readline settings in this file instead of any settings which may be in the file /etc/inputrc. That is, any settings specified in /etc/inputrc will no longer be in effect. Therefore, if the /etc/inputrc file exists, it's a good idea to start ~/.inputrc with the line:

$include /etc/inputrc

  • You're awesome, that's exactly what I need. No longer do I want to punch my monitor. :D +1000000 (I wish) – Mehrdad Jun 26 '11 at 0:08
  • This has been bugging me for years. Thanks! – BillyBBone Jul 25 '16 at 19:03
5

I enter:

ls /tmp

- wonderful. Now I wan't to enter

ls /temp 

and can prevent it to enter the history, therefore prevent it to overwrite ls /tmp, if I start the command with a blank:

 ls /temp

It's hard to see, but if you know it ...

It is controlled by

export HISTCONTROL=ignoredups
export HISTCONTROL=ignoreboth

ignoredups only ignores duplicated commands, ignoreboth ignores spaces at the beginning of line, which is useful, to hide otherwise unhidden passwords.

But maybe you're out for a solution, where you end with both commands, the unmodified old one, and the new one. My version of bash or settings behave like this, but I don't know, what's different to yours.

  • Ha; I always assumed not saving commands with a leading space was a bug. Thanks. :) – sarnold Jun 25 '11 at 23:58

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.