To prevent logging "dangerous" commands in bash history, I have added following line to my .bashrc
file:
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
this works well, but it has a side effect: I cannot see the complete history of commands executed on a machine. Let's say I have several machines for experiments, and I want to be able to see all commands executed. I would use the bash internal history
to display executed commands, and perhaps grep for today's date:
history | grep Sep-28
What I would like do have is to log "dangerous" commands as well, but put a #
at the beginning of the line, so that if I happen to execute the command from history by mistake, no damage would be done.
I have no idea if this is possible.
Update and clarification:
The main reason why this is a problem for me is that I am usually connected to my machine from several terminals, and any command executed on one terminal is immediately read into history of other terminals. This is achieved by
PROMPT_COMMAND="history -a; history -c; history -r"
Let's imagine I have two terminals open. In one I have some cat /dev/foo > file.out
process running. In the second, I check the progress with ls -lAhF
. I keep repeating ls
by pressing Up and ENTER (that is, last command from history). As soon as the first command finishes, the last command from history is no longer ls
, but cat /dev/foo > file.out
. If I am not careful, I will start cat again and overwrite file.out.
What I would like to achieve is that the cat command would be preceded with a #
, so that it would not be executed. I would, however, still see it in history and can reuse it (if it is a long command) by un-commenting it.
watch ls -lAhF
orwhile sleep 1; do ls -lAhf; done
; instead of watching the file size, you can usepv /dev/foo > file.out
(ivarch.com/programs/pv.shtml).