406

I'm working in Mac OSX, so I guess I'm using bash...?

Sometimes I enter something that I don't want to be remembered in the history. How do I remove it?

B Seven
  • 7,989

13 Answers13

651

Preventative measures

If you want to run a command without saving it in history, prepend it with an extra space

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

For this to work you need either ignorespace or ignoreboth in HISTCONTROL. For example, run

HISTCONTROL=ignorespace

To make this setting persistent, put it in your .bashrc.

Post-mortem clean-up

If you've already run the command, and want to remove it from history, first use

history

to display the list of commands in your history. Find the number next to the one you want to delete (e.g. 1234) and run

history -d 1234

Additionally, if the line you want to delete has already been written to your $HISTFILE (which typically happens when you end a session by default), you will need to write back to $HISTFILE, or the line will reappear when you open a new session:

history -w
Connor
  • 101
jw013
  • 51,212
  • 1
    It worked. I think we need to source ~/.bashrc after modifying it... – B Seven Sep 26 '12 at 18:00
  • @BSeven Yes, all bash settings are stored in RAM while the shell is running. The rc files are only for storing persistent settings for the next time the shell starts. – jw013 Sep 26 '12 at 18:03
  • There are edge cases when this will not work, but under default configurations it should. – jordanm Sep 26 '12 at 19:27
  • @jordanm What edge cases are you talking about? Are they worth listing here? – jw013 Oct 22 '12 at 02:54
  • 3
    @jw013 I set PROMPT_COMMAND to history -a, in that case it is already written to the history file, rather than on exit under normal configuration. Specifically: http://mywiki.wooledge.org/BashFAQ/088 – jordanm Oct 22 '12 at 03:54
  • but I don't want history -d command itself to be logged into history?? – Rohail Abbas Oct 06 '16 at 12:33
  • What about clearing the current terminal window buffer? For example, if I run history to find the command in which I typed a secret command, I can use history -d to delete it but someone could simply scroll up my screen and see it. – s g Dec 07 '17 at 01:00
  • @RohailAbbas - easy, you first enter HISTCONTROL=ignorespace, then invoke two history -d commands with a leading space - one for deleting your original command and one for deleting the ignorespace assignment. – maxschlepzig Oct 12 '18 at 19:57
  • YMMV, but here's how I cleared all entries that match a grep: while true; do str=\history | grep -m 1 YOUR_GREP_HERE | awk '{print $1}'`; if [[ ! $str ]]; then break; fi; history -d $str; done` – CletusW Dec 03 '18 at 23:45
  • history -w does not exist oh RHEL 7 the reason why the commands still appear for zsh users is that you also have to delete the entry from .zsh_history AND very important to logout and login again. – Matthis Kohli May 07 '19 at 12:00
  • 3
    It didn't work for me. – Felipe Jun 20 '20 at 05:17
  • Is it also possible to remove searching command from history, where when we do backward search via ctrl-p it shows up even it is not saved in the history @jw013 – alper Jul 15 '20 at 23:40
  • Why doesn't my man history show anything about -d, yet it worked? GNU History 8.1, 2020 July 17. – Gauthier Sep 15 '21 at 15:49
  • 1
    @Gauthier because history is also a bash builtin. type history reveals that. Use man bash-builtins to find the man page for it. – Dario Seidl Sep 28 '21 at 14:57
  • I get different line numbers at each call and they are always "out of range". 196994 2024-01-25-23:17I inadvertently typed my password instead of "su" 196995 2024-01-25-23:17history alex@Freesia:~$ history -d 196994 `bash: history: 196994: history position out of range`` – Alexandre Oberlin Jan 25 '24 at 22:18
  • The history -d <line number> behaved strangely for me because of my PROMPT_COMMAND: export PROMPT_COMMAND="history -a;history -r" Setting PROMPT_COMMAND= in a terminal before calling history -d <line number> did the trick. Beware however that you cannot delete several entries in one command and that line numbers change after you have deleted an entry. – Alexandre Oberlin Jan 26 '24 at 18:02
94
  1. To clear all your history, use

    history -c
    
  2. To delete a single line, use

    history -d linenumber
    
terdon
  • 242,166
soumyaranjan
  • 1,114
17

Zsh on Mac

If you are using Zsh, history -d linenumber doesn't work to delete a specific line number in the command line history. However you can edit the history file. Close and reopen your terminal and edit the history like so:

nano ~/.zsh_history

See this for more details.

Suragch
  • 321
14

I have this in my ~/.bashrc, which makes the command $ forget delete the previous command from history

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^\s*\d+') - 1);              
}
  • That seems a little complicated. Wouldn't history -d $( history | tail -n 1 | cut -f 1 -d " " ) be simpler? – seumasmac Oct 03 '15 at 01:40
  • 3
    history | tail -n1 is the history command itself, so deleting that number gets the wrong entry. However, history -d $( history | awk 'END{print $1-1}' ) combines the line select, field select, and subtraction. – dave_thompson_085 Oct 03 '15 at 03:03
  • 2
    Any chance someone could help out with portin this to zshell? – Alex S Oct 14 '15 at 13:27
11

You always can edit and remove entries from ~/.bash_history, useful when you want to remove either one entry or more than one entry

Weslor
  • 227
  • 2
    Most likely these entries will be reintroduced when you exit the shell. – l0b0 Jul 17 '18 at 02:56
  • This may needlessly remove more than necessary, or may possibly not remove anything, depending on how the shell is configured. – Kusalananda Apr 02 '20 at 08:03
6

If you want to forget the entire bash session, you can kill the current bash process. Since the variable $$ hold the pid of the current shell, you can do:

kill -9 $$
  • This does not take the history that is written to $HISTFILE into account. – Kusalananda Apr 02 '20 at 08:02
  • @Kusalananda unless you have taken special steps to write to the $HISTFILE immediately, this should work. The ONLY think I have taken into account is the $HISTFILE. What experience have you had (with my proposal) that causes you concern? – Bruno Bronosky Apr 13 '20 at 15:39
  • 1
    If the thing that the user entered was in a previous session, killing the current shell would not remove that single thing from the history file. Also, I'm on systems where the admins have changed the default setup so that commands are written to the history file after every given command. We know nothing about the current user's setup. – Kusalananda Apr 13 '20 at 15:41
  • @Kusalananda your statement is true. However, I would hope that no one would ever try to kill the current process trying to affect the result of a past completed process. That's just illogical to expect. But it does suggest a slightly different phrasing to your original comment that would have avoided the confusion. "This does not affect the history that was written to $HISTFILE in previous sessions." In other words, "this concept is only good for preventing the situation, not correcting it." Thanks for clarifying, friend. – Bruno Bronosky Apr 13 '20 at 15:48
  • 1
    Well, it wouldn't affect the history written to $HISTFILE in the current session either, so I really don't see how that comment could be misinterpreted. The only thing you have to add to your answer is the assumptions under which the given solution solves the problem. There is really only one assumption, namely that the command that should be removed from the history hasn't yet been written to $HISTFILE. Then you may want to elaborate under what conditions the command would have been written to $HISTFILE. – Kusalananda Apr 13 '20 at 15:53
5

To remove a single line from the history file, use the -d option. For example, if you want to clear a command where you entered the clear-text password as in the scenario above, find the line number in the history file and run this command.

$ history -d 2038

To delete or clear all the entries from bash history, use the history command below with the -c option.

$ history -c

Alternatively, you can use the command below to delete the history of all last executed commands permanently in the file.

$ cat /dev/null > ~/.bash_history

Also With Bash 5, you can delete a range aswell

history -d 511-520

3

1- in bash terminal type

history # This will list all commands in history .bash_history file with line numbers

ex:

  ...
  987  cd
  988  ssh x@127.0.0.1
  990  exit
  991  cd

2- pick the CMD line number you want to delete

history -d 988

Note: if you want to delete for example last 3 CMDs, just pick the third line number from bottom ex: 988 and repeat the CMD history -d 988 3 times in sequence.

Paulo Tomé
  • 3,782
  • Welcome on U&L! This really looks similar to (a part of) the accepted answer (except for the suggestion about deleting consecutive commands). Is there anything you can add to make it less of a repetition? – fra-san Mar 16 '20 at 10:41
  • Sorry, no and for the first look I didn't understand the accepted answer [and you won't believe that I checked other answers with more details explained] so when I figured out that history command lists the used commands I just wanted to explain that! – KhogaEslam Mar 16 '20 at 12:26
  • 1
    No problem. Answers that happen to be duplicates of other answers may eventually be deleted and I just try to make sure people have room to deal with that possibility before it happens ;-) – fra-san Mar 16 '20 at 17:47
  • Alternate opinion. The question asked to delete a single entry, so I upvoted the ones that answered the question first, not as an afterthought. – gbarry Dec 20 '21 at 17:12
2

You need to write the changes after you cleared the history. And if you wouldn't like to have the history wipe command in your history then you need to run the command like that:

history -c && history -w && logout

Good luck.

1

In Ubuntu (but I'm pretty sure, it will be work for other Linux distributions and also MacOS the same way) the bash history file can be simply edited in an arbitrary text editor:

$ nano ~/.bash_history

If you don't know, where it's stored, you can find it as follows:

$ echo $HISTFILE

Or you can just do it a bit more generic way:

$ nano $HISTFILE
automatix
  • 199
  • This does not take into account that the current in-memory history of the shell would be written to the file when the shell exits. This would not delete a command from the history that is resident in the in-memory history of the shell. – Kusalananda Apr 02 '20 at 08:05
1

If you have hstr (a way better reverse-i-search that can be installed with sudo apt install hstr), then it's really simple:

  1. Open your terminal and press Ctrl+r to search your history.
  2. Type some characters to search for the command you want to delete from your history, then use arrow keys to go down and highlight the item.
  3. Press the delete key, and press y to confirm.
joe
  • 172
  • 7
0

If you want to delete a range of history lines, you can use the script below.

This example will delete history output from line 1 to line 150.

for i in `history | awk 'NR > 1 && NR <=150{print   $1}'`; do history -d $i; done
0

Quick steps:

  1. Find out where is your terminal's history file with echo $HISTFILE
  2. Open the file with your text editor
  3. Delete the sensitive lines you find there
  4. Save the file
  5. Close and reopen your terminal
  6. DONE: your history is clean! You can validate that by running the history command in your terminal