Em zsh, é possível direcionar a saída de rastreamento de set -x
( set -o xtrace
) para um descritor de arquivo diferente de stderr?
Estou procurando um equivalente $BASH_XTRACEFD
ou uma maneira de emular o mesmo comportamento.
Em zsh, é possível direcionar a saída de rastreamento de set -x
( set -o xtrace
) para um descritor de arquivo diferente de stderr?
Estou procurando um equivalente $BASH_XTRACEFD
ou uma maneira de emular o mesmo comportamento.
A partir do zsh 5.7, a resposta é não. A saída de rastreamento sempre vai para stderr.
Fonte: lendo a fonte. A saída do rastreamento é gravada no arquivo
xtrerr
, que parece promissor, mas as únicas atribuições paraxtrerr
são parastderr
, para uma cópia dele ou paraNULL
.Deve ser possível escrever um módulo carregável dinamicamente que defina
xtrerr
, mas escrever um módulo fora da árvore de origem zsh não é fácil.Uma solução possível é emular
xtrace
com uma armadilha . Isso fornece as mesmas informações básicas na maioria dos casos, mas tenho certeza de que há muitos casos de canto onde seria difícil ou impossível emular perfeitamente. Uma diferença é que a herança da opção e a herança de traps seguem regras diferentes em algumas circunstâncias relacionadas a funções, subshells, etc. Prova de conceito:DEBUG
xtrace
xtrace
emulate
Ou talvez um pouco mais sofisticado (não testado):
Estou usando uma solução muito simples que pode ser útil se você quiser depurar apenas uma função específica, embora a mesma ideia possa ser aplicada ao rastreamento completo com
set -x
:Quando eu preciso depurar uma função específica, digamos
myfunc
, eu abro um shell filhoTRACE_FUNC=myfunc zsh -l 2> debug.err.txt
enquanto eu configurei algo no meu~/.zshrc
algo ao longo das linhas de:Você pode aplicar a mesma ideia colocando
~/.zshrc
o seguinte:E gere o shell filho com
TRACE_ZSH=1 zsh -l 2> debug.err.txt
.