Primeiro preexec_invoke_exec
precisa ser modificado para evitar várias execuções de preexec
. Além disso, modifique preexec
para levar em conta o número real de linhas em $PS1
:
preexec () {
# delete old prompt; one "\e[1A\e[K" per line of $PS1
for (( i=0, l=$(echo -e $PS1 | wc -l) ; i < l ; i++ ))
do
echo -ne "\e[1A\e[K"
done
# replacement for prompt
echo -ne "\e[31;1m$ \e[0m"
echo -n "$1"
echo -ne " \e[37;2m["
echo -n "$2"
echo -e "]\e[0m"
}
preexec_invoke_exec () {
[ -n "$DONTCLEANPROMPT" ] && return
DONTCLEANPROMPT=x
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command='history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"';
local this_pwd='pwd'
preexec "$this_command" "$this_pwd"
}
trap 'preexec_invoke_exec' DEBUG
PROMPT_COMMAND='unset DONTCLEANPROMPT'
Para que preexec
seja executado novamente, DONTCLEANPROMPT
precisa ser desfeito ou definido como ''
. Isso é feito com PROMPT_COMMAND
, que é executado logo antes do prompt principal ser emitido. Portanto, preexec
será executado uma vez e somente uma vez para cada linha de comando.