Como faço para que "bash -x" (modo de depuração) seja recursivo em scripts de origem?

Como faço para que "bash -x" (modo de depuração) seja recursivo em scripts de origem?

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

Linux: 3.2.25

OS X: 3.2.48

Aqui está um trecho do comportamento não recorrente 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 atualização? Isso é causado pela diferença de versão?

Responder1

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

Responder2

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

Agora todos os scripts de origem serão executados mais em depuração. Lembre-se de que quando você cria um script, ele é executado no shell atual; portanto, se você definir -x uma vez, isso será bom para todos os scripts de origem.

informação relacionada