Execute a command without keeping it in history

LinuxBashUnix

Linux Problem Overview


I want to execute some commands, but I don't want to store them in the command history. So that nobody will be able to search them in the .bash_history file.

Is there a way how to execute Bash commands this way?

Linux Solutions


Solution 1 - Linux

Start your command with a space and it won't be included in the history.

Be aware that this does require the environment variable $HISTCONTROL to be set.

  • Check that the following command returns ignorespace or ignoreboth:

     echo $HISTCONTROL
    
  • To add the environment variable if missing, the following line can be added to the Bash profile. E.g., to file %HOME/.bashrc.

     export HISTCONTROL=ignorespace
    

After sourcing the profile again, space-prefixed commands will not be written to $HISTFILE.

Solution 2 - Linux

In any given Bash session, set the history file to /dev/null by typing:

export HISTFILE=/dev/null

Note that, as pointed out in the comments, this will not write any commands in that session to the history!

Just don't mess with your system administrator's hard work, please ;)

Doodad's solution is more elegant. Simply unset the variable: unset HISTFILE (thanks!)

Solution 3 - Linux

echo "discreet";history -d $(history 1)

Solution 4 - Linux

An extension of John Doe's and Cédric ROYER's answer. But, this seems to work for me.

<your_secret_command>; history -d $((HISTCMD-1))

You should not see the entry of the command in your history.

Here's the explanation...

The 'history -d' deletes the mentioned entry from the history.

The HISTCMD stores the command_number of the one to be executed next. So, (HISTCMD-1) refers to the last executed command.

Remove a certain line from Bash history file

Solution 5 - Linux

If you are using Z shell (zsh) you can run:

setopt histignorespace

After this is set, each command starting with a space will be excluded from history.

You can use aliases in .zshrc to turn this on/off:

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

Solution 6 - Linux

You might consider using a shell without history, like perhaps

/bin/sh << END
   your commands without history
END

(perhaps /bin/dash or /bin/sash could be more appropriate than /bin/sh)

Or even better, use the batch utility, e.g.,

batch << EOB
   your commands
EOB

The history would then contain sh or batch which is not very meaningful.

Solution 7 - Linux

You can start your session with

export HISTFILE=/dev/null ;history -d $(history 1)

then proceed with your sneaky doings. Setting the histfile to /dev/null will be logged to the history file, yet this entry will be readily deleted and no traces (at least in the history file) will be shown.

Also, this is non-permanent.

Solution 8 - Linux

As mentioned by Doodad in comments, unset HISTFILE does this nicely, but in case you also want to also delete some history, do echo $HISTFILE to get the history file location (usually ~/.bash_history), unset HISTFILE, and edit ~/.bash_history (or whatever HISTFILE was - of course it's now unset so you can't read it).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Then you've edited your history, and the fact that you edited it!

Solution 9 - Linux

You can also use the following command:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

I think it's a very portable command.

Solution 10 - Linux

There are several ways you can achieve this. This sets the size of the history file to 0:

export HISTFILESIZE=0

This sets the history file to /dev/null, effectively disabling it:

export HISTFILE=/dev/null

For individual commands, you can prefix the command with a space and it won't be saved in the history file. Note that this requires you have the ignorespace value included in the $HISTCONTROL environment variable (man bash and search for ignorespace for more details).

Solution 11 - Linux

You just need to run:
$ set +o history

To see more, run:
$ man set

Solution 12 - Linux

This is handy if you want to erase all the history, including the fact that you erased all the history!

rm .bash_history;export HISTFILE=/dev/null;exit

Solution 13 - Linux

This command might come in handy. This will not record the command that is executed

history -d $((HISTCMD-1)) && <Your Command Here>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJan VorcakView Question on Stackoverflow
Solution 1 - Linuxu-punktView Answer on Stackoverflow
Solution 2 - LinuxMiquelView Answer on Stackoverflow
Solution 3 - LinuxJohn DoeView Answer on Stackoverflow
Solution 4 - LinuxRangaraj KSView Answer on Stackoverflow
Solution 5 - LinuxRotaretiView Answer on Stackoverflow
Solution 6 - LinuxBasile StarynkevitchView Answer on Stackoverflow
Solution 7 - LinuxChristianView Answer on Stackoverflow
Solution 8 - LinuxdrkvogelView Answer on Stackoverflow
Solution 9 - LinuxCédric ROYERView Answer on Stackoverflow
Solution 10 - LinuxpglView Answer on Stackoverflow
Solution 11 - LinuxIgor SantosView Answer on Stackoverflow
Solution 12 - LinuxcndView Answer on Stackoverflow
Solution 13 - LinuxRAVI THEJAView Answer on Stackoverflow