Como eu faço o “bash -x” (modo de depuração) recorrer a scripts de origem?

8

Estou tentando depurar o que o bash faz na inicialização do login para Linux. Eu li que "bash -x" fará o bash imprimir o que está fazendo, mas não imprime comandos em arquivos de origem como "set -x". Não consigo usar "set -x" porque a inicialização é executada antes de poder chamá-lo. "bash -x" parece se reciclar bem no OS X, mas isso pode ser por causa das versões bash.

Linux: 3.2.25

OS X: 3.2.48

Aqui está um trecho do comportamento não recursivo no Linux:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

Observe como /etc/profile.d/vim.sh é originado, mas seus comandos não são impressos. Existe uma solução alternativa sem atualizar? Isso é causado pela diferença de versão?

    
por Kelvin 18.04.2012 / 18:42

2 respostas

1

set -x em algum lugar no arquivo raiz (aquele que requer todos os outros arquivos) deve funcionar. Como alternativa, introduza algo como [[ !-z "$DEBUG" ]] && set -x em cada arquivo e chame com DEBUG=1 script.sh .

    
por 19.04.2012 / 02:31
0

Como você está obtendo scripts e não está executando, seu primeiro comando no script principal deve ser "set -x"

Agora, todos os scripts de origem serão executados na depuração mais. Lembre-se de quando você fonte um script, ele é executado em seu shell atual, então se você definir -x uma vez, isso será bom para todos os scripts de fontes.

    
por 20.04.2018 / 09:24