Você pode usar o DEBUG trap para fazer isso. Nesta armadilha, $BASH_COMMAND contém o último comando executado.
trap 'echo "you tried to call the command [$BASH_COMMAND]"' DEBUG
Observe que, se você estiver executando comandos como parte de seu prompt ou $PROMPT_COMMAND , o trap também será executado nesses comandos. Você pode adicionar verificações para ver se $BASH_COMMAND é o mesmo que $PROMPT_COMMAND para evitar algumas delas.
Quanto à execução quando o comando não existe, no bash, se uma função chamada command_not_found_handle existe, essa função é executada sempre que um comando não é encontrado. Ele é executado com todos os argumentos da linha de comando que você tentou executar como argumentos, para que você possa fazer algo assim:
command_not_found_handle() {
echo "you tried to call the command [$@]"
}
Isso resulta em:
$ foo bar
you tried to call the command [foo bar]
$