xtrace
output vai para stderr, então você pode redirecionar stderr
para /dev/null
:
ikwtd() {
echo do stuff
} 2> /dev/null
Se você ainda quiser ver os erros dos comandos executados dentro das funções, você pode fazer
ikwtd() (
{ set +x; } 2> /dev/null # silently disable xtrace
echo do stuff
)
Observe o uso de (...)
em vez de {...}
para fornecer um escopo local para essa função por meio de um subshell. bash
, já que a versão 4.4 agora suporta local -
como no shell Almquist para tornar opções locais para a função (semelhante a set -o localoptions
em zsh
), então você pode evitar a subshell fazendo:
ikwtd() {
{ local -; set +x; } 2> /dev/null # silently disable xtrace
echo do stuff
}
Uma alternativa para bash
4.0 a 4.3 seria usar a variável $BASH_XTRACEFD
e ter um descritor de arquivo dedicado aberto em /dev/null
para isso:
exec 9> /dev/null
set -x
ikwtd() {
{ local BASH_XTRACEFD=9; } 2> /dev/null # silently disable xtrace
echo do stuff
}
Como bash
não tem a capacidade de marcar um fd com o sinalizador close-on-exec , isso tem o efeito colateral de vazar o fd para outros comandos.
Veja também este locvar.sh que contém algumas funções para implementar o escopo local para variáveis e funções em scripts POSIX e também fornece com trace_fn
e untrace_fn
funções para torná-las xtrace d ou não.