Argumentos de função padrão (manualmente emitindo sinais psuedo bash)

1

Estou procurando uma solução que me permita automaticamente chamar uma função com parâmetros específicos em uma determinada situação.
Aqui está o cenário específico:

Quando ocorre um erro, posso configurar meu manipulador de erros assim:

function _trap_err () {
    echo "An error occurred in "$1":"$2" on "$3":"$4".
}

E eu posso definir a armadilha para coletar os dados de depuração que preciso automaticamente - no momento correto da execução .

trap '_trap_err "$BASH_SOURCE" "$BASH_LINENO" "$FUNCNAME" "$BASH_COMMAND" ' ERR

AFAIK, isso só funciona quando o bash detecta um erro e emite o sinal.

Gostaria de estender esse comportamento para que eu possa sinalizar manualmente um erro quando uma verificação falhar, por exemplo, ao verificar os argumentos da função:

# Usage: myfunc <requiredarg>
function myfunc () {
    [[ $# != 1 ]] && emit_err_signal
}

Se houver uma maneira de emitir manualmente esse sinal de erro, é possível coletar automaticamente esse argumento de depuração no momento correto em execução para fornecer informações de depuração significativas.

A alternativa é simplesmente exibir uma mensagem de erro - que deve ser codificada em cada verificação - e não exibe onde o erro ocorreu.

Alguma idéia?

EDITAR
Eu deveria ter especificado que isso é para meus arquivos .bashrc e não quero que eles saiam, eu só quero informações de depuração. Armadilhas podem ter um exagero, acho que a seguinte solução pode funcionar:

function _debug () {
    local _message=${1:-""}
    printf "\e[1;32m[BASHRC] DEBUG: %-20s - %s\e[0m\n" "$BASH_SOURCE:$BASH_LINENO" "$_message"
}

_debug "Testing debug message."

> [BASHRC] DEBUG: .bashrc.d/bashrc:18  - Testing debug message.
    
por nfarrar 27.04.2014 / 18:13

2 respostas

0

Você pode usar o código de saída:

set -e
# Usage: myfunc <requiredarg>
ARGS_NUM_ERROR=50
function myfunc () {
    [[ $# != 1 ]] && exit $ARGS_NUM_ERROR
}

Então você pode interceptar ARGS_NUM_ERROR em seu roteiro com o tratamento adequado.

    
por 27.04.2014 / 19:17
-1

O ERR trap é acionado para qualquer comando com um status de saída diferente de zero. Não há necessidade de mais ações explícitas para que ele seja executado.

function _trap_err () {
  echo "An error occurred in $1:$2 on $3:$4."
}
trap '_trap_err "$BASH_SOURCE" "$BASH_LINENO" "$FUNCNAME" "$BASH_COMMAND" ' ERR

foo () {
    false
}

foo
echo "Some commands that succeed"
foo
    
por 28.04.2014 / 18:18