Não é muito bonito, mas se você realmente precisar disso, poderá usar PROMPT_COMMAND
além da depuração de depuração para se livrar das chamadas extras:
trap 'debug_hook' DEBUG
debug_hook()
{
[ -n "$debug_hook_on" ] || return
debug_hook_on=""
echo hook # cmds to run ...
}
PROMPT_COMMAND='debug_hook_on=1'
Agora:
$ echo 1 ; echo 2 | cat
hook
1
2
No entanto, ainda não temos acesso a toda a linha de entrada: $BASH_COMMAND
é apenas echo 1
.
Outra ideia inspirada por este artigo é usar ligações readline para ter acesso ao todo linha:
$ bind -x '"\C-o":hook'
$ hook(){ echo "hook: $READLINE_LINE"; }
$ bind 'RETURN: "\C-o\n"'
Agora funciona:
hook: echo 1; echo 2
$ echo 1; echo 2
1
2
Uma coisa a ter em mente: para uma entrada de várias linhas, ela será invocada uma vez para cada linha, o que pode não ser o que você deseja (poderia usar uma combinação de ambas as abordagens).