Temporarily suspend bash_history on a given shell?

Is there a way to temporarily suspend history tracking in bash, so as to enter a sort of “incognito” mode? I’m entering stuff into my terminal that I don’t want recorded, sensitive financial info.

Asked By: Naftuli Kay

||

This will prevent bash from saving any new history when exiting the shell:

unset HISTFILE

Specifically, according to man bash:

If HISTFILE is unset, or if the history file is unwritable, the history is not saved.

Note that if you re-set HISTFILE, history will be saved normally. This only affects the moment the shell session ends.

Alternatively, if you want to toggle it off and then back on again during a session, it may be easier to use set:

set +o history # temporarily turn off history

# commands here won't be saved

set -o history # turn it back on
Answered By: SiegeX

Using bash, set HISTCONTROL="ignorespace" and precede with space any command you do not wish to be recorded in history. In case you forgot to take any measures, there is also history -d <number> for deleting a specific entry or history -c for clearing the entire command history.

Answered By: forcefsck

Make sure that HISTCONTROL contains ignorespace. You’ll probably want to add HISTCONTROL=ignorespace (or HISTCONTROL=ignoredups:ignorespace or something) to your ~/.bashrc. Then any command line that begins with a space is omitted from the history.

Another possibility is to start a new bash session that doesn’t save its history.

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent shell

There is one simple way to turn off the history, so commands won’t be stored in the .bash_history file.

You have to put the whitespace or tab space in front of any command, so that command won’t be stored in the history. For example:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

The pwd command will not get store in the history, because it has whitespace in the front.

Answered By: Kalanidhi M.
export HISTFILE=/dev/null 

That is my goto way. Just in case the unset HISTORY/HISTFILE/HISTCONTROL, etc… doesn’t work, exporting it to /dev/null has always worked for me.

Answered By: Ambrose

If you need to avoid storing several commands and you still want to use up arrow to access previous commands, use:

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

There are four ways (levels) to control how commands are stored.

  1. The first and simplest is to use ignorespace (or ignoreboth):

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"
    

    That will allow to use an space before the commands that you want to avoid being recorded in the memory list of history. And, in consequence, as there is no command recorded in memory that could be sent to file, will also avoid one command to be sent to the file listed in $HISFILE.

  2. Avoid recording commands to the file in $HISTFILE:

    $ unset HISTFILE
    

    If unset, the command history is not saved when a shell exits.

    Null HISTFILE='' and/or set to HISTFILE=/dev/null works to the same effect.
    Understand that commands are still being recorded to the memory list , try the history command, or the up arrow.

    Warning: if HISTFILE is reset before the shell exists, all what has been recorded in memory could be written to the file anyway.

  3. Avoid recording new commands to the history list in memory.
    And, as not being in memory, can not be recorded to file.

    $ shopt -ou history              # or set +o history
    

    Re-enable with shopt -os history (or set -o history)

  4. Remove all commands from to the history list in memory:

    $ HISTSIZE=0
    

    All commands get erased (from memory) and therefore nothing could be stored to file, of course, until the variable is set again to some valid numeric value.

Answered By: user232326

To take SiegeX’s answer a bit further and really make this into incognito mode…

Disclaimer: title stuff will probably on work on gnome-terminal. it was only tested in Linux Mint 19.3 / Gnome Terminal 3.28.1 because i’m lazy.

Add the following to your ~/.bash_functions (this assumes you are importing it via your .bashrc / .profile etc):

function setGnomeTerminalTitle() {
    local NEW_TITLE="$1";
    PS1="[e]0;${NEW_TITLE}a]${debian_chroot:+($debian_chroot)}[33[01;32m]u@h[33[00m] [33[01;34m]w $[33[00m]";
}

Then add the following to your ~/.bash_aliases (again this assumes you are importing it via your .bashrc / .profile etc):

alias title="setGnomeTerminalTitle";
alias hist='history'
alias histoff="setGnomeTerminalTitle 'Incognito Window' && set +o history"
alias histon="setGnomeTerminalTitle "$USER@$HOSTNAME:${PWD//${HOME//\//\\\/}/\~}" && set -o history"

EDIT: to explain the histon title stuff – normally the window title in gnome-terminal is “$USER@$HOSTNAME:${PWD}” except that if you are in your home folder, /home/foo, it gets displayed as ~; at least it is on my computer. this command is using bash string substitutions to escape the slashes in $HOME so we get /home/foo and then in turn using that as a regex to replace that pattern in $PWD with a literal ~ … and then a bunch of escapes are added on top to make it work as an alias in a double-quoted string.

Now when you type histoff you get a title change for incognito mode and your history is stopped for that session in that window (the word histoff is still logged but nothing after). If you then type histon it reverts the title and all of the lines after histoff up to and including the line with histon are not logged but everything after histon is logged.

Example:

## this is still logged
histoff  

## this is NOT logged
echo "my password is: password";
fake_ua='If firefox and curl had a child, would it be named furl?';
curl -A "$fake_ua" https://www.itsnotap0rnsiteipromise.com/curvy-girlz/;

vi ~/Documents/maths/super-secret-squirrel/gift-ideas.txt

## this is still NOT logged
histon

## this is logged again
sudo apt install -y kmag;

Answered By: zpangwin
Categories: Answers Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.