Pular para o conteúdo

Como exibir no sysout de um script o nome da função chamada em caso de erro? [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar

1. Como exibir no sysout de um script o nome da função chamada em caso de erro? [RESOLVIDO]

Enviado em 17/07/2017 - 21:42h

Durante a execução de um script qualquer em shell, se em algum trecho de seu contendo contiver o $0 (geralmente utilizado para referenciar erros) irá retornar o nome do script chamador, por exemplo:

##SCRIPT teste.sh##
if [ -z "$1" ];then
echo "ERRO: Falta informar o parametro do script. Usage $0 parametro";
fi


Mas como fazemos a mesma coisa só que em funções? Ex:


function faz_alguma_coisa {
if [ -z "$1" ];then
echo "ERRO: Falta informar parametro na função. Usage (?????) parametro";
fi
}


Responder tópico

3. Re: Como exibir no sysout de um script o nome da função chamada em caso de erro? [RESOLVIDO]

Enviado em 17/07/2017 - 22:02h

mlgrassi escreveu:

Durante a execução de um script qualquer em shell, se em algum trecho de seu contendo contiver o $0 (geralmente utilizado para referenciar erros) irá retornar o nome do script chamador, por exemplo:

...
Mas como fazemos a mesma coisa só que em funções? Ex:
...


se eu não me engano é chamando a função
function faz_alguma_coisa {
if [ -z "$1" ];then
echo "ERRO: Falta informar parametro na função. Usage (?????) parametro";
fi
}
faz_alguma_coisa




------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------

4. Re: Como exibir no sysout de um script o nome da função chamada em caso de erro? [RESOLVIDO]

Enviado em 18/07/2017 - 17:24h

Muito obrigado !

Este link me ajudou, e assim compartilho com os visitantes do VOL a resposta à minha pergunta.

Quando declaramos uma função, o shell irá criar e popular um vetor padrão denominado FUNCNAME o qual terá a quantidade de índices e valores criados de acordo com as seguintes situações:

1) Se a função é declarada diretamente no terminal do shell
A quantidade de índices será igual ao número de funções declaradas individualmente, ou seja, se tivermos por exemplo 3 funções declaradas, como logicamente são executadas sequencialmente, a cada chamada o shell irá criar um vetor com 1 índice e atribuir como valor o nome da função.
Se uma função estiver dentro de outra função e assim sucessivamente, o número de índices será proporcional a isso

2) Se a função estiver dentro de um script
A quantidade de índices será igual ao número de funções individuais declaradas, ou funções dentro de funções + 1.
Esse +1 refere-se a função oculta main utilizada quando se executam scripts shell.
Ao exibirmos todo o conteúdo de FUNCNAME:
echo ${FUNCNAME[@]} 
serão exibidas todas as funções em ordem decrescente + a função main.
No entanto, como falado anteriormente, para cada função, há um FUNCNAME diferente sendo que a quantidade de índices será sempre 2, exceto para caso houver uma função dentro da outra.

Segue um exemplo para entendermos melhor

Exemplo:

function primeira {
echo "Imprimindo ${FUNCNAME[@]}";
}

function segunda {
echo "Imprimindo ${FUNCNAME[@]}";
primeira;
}

function externa {
echo "Imprimindo ${FUNCNAME[@]}";
function interna {
echo "Imprimindo ${FUNCNAME[@]}";
}
interna;
}
primeira;
segunda;
externa;


Executando este código através de um script a saída será:
Imprimindo primeira main
Imprimindo segunda main
Imprimindo primeira segunda main
Imprimindo externa main
Imprimindo interna externa main


Agora executando o mesmo código diretamente no terminal shell, a saída será:

Imprimindo primeira
Imprimindo segunda
Imprimindo primeira segunda
Imprimindo externa
Imprimindo interna externa

5. Re: Como exibir no sysout de um script o nome da função chamada em caso de erro? [RESOLVIDO]

Enviado em 18/07/2017 - 18:59h

Valeu pela explicação. Vou até favoritar. Espero não me esquecer.

Você deveria criar uma dica.

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder