bash no evento de comando (ou shell)

2

Existe uma maneira de capturar todos os comandos executados em bash ou ainda melhor em sh ?

Eu preciso de um script wrapper que seja chamado toda vez que um comando for executado. Por exemplo, quando digito cd /home/ , quero que meu script de wrapper command_wrapper.sh seja chamado. Dentro quero cancelar o comando ou chamar outro comando.

#!/bin/sh
#command_wrapper.sh

echo "you tried to call the command [$@]"

Também seria bom se o script fosse chamado apenas quando um comando não existisse. Isso é possível?

    
por bricklore 23.07.2015 / 18:21

1 resposta

6

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]
$
    
por 23.07.2015 / 18:25