Em um script bash tenho uma log()
função que é usada em vários lugares, assim como uma logs()
função que desvia muita linha para arquivos log()
. Quando executo partes do script com set -x
, obviamente todos os comandos dentro logs()
e log()
são rastreados também.
Eu gostaria de definir logs()
e log()
tal que pelo menos seu conteúdo, na melhor das hipóteses, até mesmo sua chamada seja suprimida da set -x
saída.
Você não pode alterar como a função é invocada de dentro da função, mas pode definir a função para invocar um subshell que desativa imediatamente o rastreamento; observe os parênteses ao redor do corpo em vez das chaves típicas:
A invocação
log()
gera apenas a chamada em si (a partir doset -x
código existente) e aset +x
chamada, não o restante dos comandos subsequentes na função. Aset -x
configuração existente é restaurada assim que a função é encerrada.Um hack rápido e sujo que deve funcionar em todos os shells é (temporariamente) tornar seu
log
script externo em vez de uma função.No bash, você também pode usar uma combinação
trap '...' DEBUG
e , que é muito mais versátil do que . Exemplo:shopt -s extdebug
set -x
(Claro, você pode dispensar o formato estranho + recuo e torná-lo completamente
set-x
-like; você também pode redirecioná-lo para outro arquivo em vez de misturado com o stderr dos comandos.)Então:
vai resultar em:
Para suprimir a saída do xtrace, basta usar
set -x
. Para ligá-lo novamente, useset -x
. Para detectar se está ativado, useshopt -q -o xtrace
. por exemploAinda há alguma 'conversa', mas isso é o melhor que posso fazer. Para suprimir a visualização das chamadas para log(), você pode cercar cada chamada para log() com um código semelhante em vez de dentro da função.