%20seja%20recursivo%20em%20scripts%20de%20origem%3F.png)
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 -x
em algum lugar do arquivo raiz (aquele que requer todos os outros arquivos) deve funcionar. Alternativamente, introduza algo como [[ !-z "$DEBUG" ]] && set -x
em 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.