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

10

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" faz. Não consigo usar "set -x" porque a inicialização é executada antes que eu possa chamá-lo. "bash -x" parece ser bem remunerado no OS X, mas isso pode ser devido às 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 o /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?

Kelvin
fonte

Respostas:

1

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

mkaito
fonte
Onde está o arquivo raiz? É independente da plataforma?
Kelvin
Com "arquivo raiz", quero dizer simplesmente o arquivo que você está chamando no shell e que está importando os outros arquivos. No meu exemplo, o arquivo de raiz seria script.sh
mkaito
11
Mas a inicialização do bash login ocorre antes da execução do script. É tarde demais para executar "set -x" no script. Tente você mesmo - execute "bash -l -x script.sh". Você verá coisas acontecendo antes da execução dos comandos do seu script.
Kelvin
Por que diabos você executaria um script bash -l? Isso é destinado a conchas interativas. Um script não é um shell interativo.
mkaito
3
Por favor, tenha um pouco mais de mente aberta - obviamente os criadores do bash acharam que seria útil. Eu vejo 2 usos (pelo menos): 1) Você deseja executar ssh user@host 'bash -l -c command'para obter o ambiente adequado carregado. 2) Você é um administrador de sistema e deseja solucionar o que os scripts init estão fazendo antes da execução do script - bash -l -xmostrará a você. Às vezes, você deseja saber onde uma variável env está sendo definida.
Kelvin
0

Como você está fornecendo 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 em depuração mais. 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.

Sam
fonte