Isso funciona bem para mim.
set -x
está desativado para começar e, com d=0
, não é definido:
$ dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
$ d=0;dtest
abc
Aqui, é colocado no meio da função, os dois últimos comandos impressos no traço:
$ d=1;dtest
+ var=abc
+ echo abc
abc
Aqui, set -x
entra em vigor a partir da última execução da função e fica desativado no meio da função. O rastreio não é impresso para os dois últimos comandos, depois que set +x
é executado.
$ d=0;dtest
+ d=0
+ dtest
+ '[' 0 -gt 0 ']'
+ set +x
abc
Se você quiser desabilitar o rastreamento incondicionalmente no final da função, você
tem que adicionar uma chamada para set +x
.
Como alternativa, para que a alteração tenha efeito somente dentro da função, você pode usar local -
(nas versões atuais do Bash) no início da função ou salvar o valor de $-
manualmente antes de fazer alterações e definir / redefinir o rastreamento com base no valor salvo no final. A execução da função em um subshell teria um efeito semelhante, mas, nesse caso, qualquer alteração nas variáveis da função também não seria visível fora dela.