always prompt the user before executing a command in the shell
Solution 1:
Do you want it to work without typing an extra command, e.g.
$ rm file
Or only when the user types something like
$ confirm rm file
Or only when the user tries to run certain commands, e.g.
$ rm file
but not for
$ echo "Hello"
If option 1, that can be done using the preexec hook in zsh, or the DEBUG trap in bash.
If option 2, put something like this in /etc/bash.bashrc
or other shell startup file.
confirm() {
echo -n "Do you want to run $*? [N/y] "
read -N 1 REPLY
echo
if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
"$@"
else
echo "Cancelled by user"
fi
}
If option 3, you could modify the confirm
script above, or, some commands have an option to ask before doing something, e.g. rm -i
. You could put
alias rm='rm -i'
in /etc/bash.bashrc
.
Solution 2:
I have played with bash a bit and figured out a hack by which this could be made possible.
#!/bin/bash
debug_trap () {
echo "executing $BASH_COMMAND"
echo "Allow?"
select choice in yes no
do
if [ "$choice" = "yes" ]
then break
elif [ "$choice" = "no" ]
then return 1
fi
done
}
shopt -s extdebug
trap debug_trap DEBUG
You can save this script under, say, confirm-any-command.sh
and source
it in your bashrc
. It will ask for confirmation of each command you will try to execute.
Please note that this is nothing more than a proof-of-concept hack; I doubt it can really be any useful in this form. If you will have to confirm each and every command you type, you will very soon acquire a habit to automatically hit "yes" after each command. Your mental mapping for "end of command" will change from just Enter to Enter,yes,Enter - you will be typing it as a whole, don't even trying to spend some time on verifying that you really want this command to execute. This is counterproductive and won't help you.