Normalmente gosto que toda a saída de depuração de um script vá para um arquivo, então terei algo como:
exec 2> somefile
set -xv
Isso funciona muito bem no bash, mas notei que no ksh ele se comporta de maneira diferente quando se trata de funções. Percebi que quando faço isso no ksh, a saída não mostra o rastreamento da função, apenas que a função foi chamada.
Ao fazer alguns testes adicionais, notei que o comportamento também depende de como a função foi declarada, se eu usar a sintaxe ksh de:
function doSometime {....}
Tudo o que vejo é a chamada da função, porém se declarar a função usando o outro método, por exemplo
doSomething() {....}
O rastreamento funciona conforme o esperado. É possível trabalhar set -xv
da mesma forma com os dois tipos de declarações de função? Eu tentei export SHELLOPTS
e isso também não fez diferença.
Estou usando o ksh93 no Solaris 11.
Responder1
Da documentação:
Funções definidas pelofunção nomesintaxe e chamado pelo nome são executados no mesmo processo que o chamador e compartilham todos os arquivos e apresentam o diretório de trabalho com o chamador. As armadilhas capturadas pelo chamador são redefinidas para sua ação padrão dentro da função.
Enquanto
Funções definidas com onome() sintaxe e funções definidas com a sintaxe do nome da função que são invocadas com o . integrados especiais são executados no ambiente do chamador ecompartilhe todas as variáveis e armadilhas com o chamador.
A solução é não usar a function
palavra-chave; atenha-se à forma padrão de definições de funções.
Alternativamente, se você estiver interessado apenas em algumas funções, typeset -tf fname
apenas rastreará a função fname
(se ela foi definida com a function
palavra-chave).
Para interromper o rastreamento:typeset +tf fname
Para rastrear todas essas funções no ksh93:typeset -tf $(typeset +f)
Para ver quais funções são rastreadas:typeset +tf
Para parar de rastrear todas as funções:typeset +tf $(typeset +tf)