¿Cómo hago que "bash -x" (modo de depuración) recurse en scripts de origen?

10

Estoy tratando de depurar lo que hace bash en la inicialización de inicio de sesión para Linux. He leído que "bash -x" hará que bash imprima lo que está haciendo, pero no imprime comandos en archivos de origen como "set -x". No puedo usar "set -x" porque la inicialización se ejecuta antes de poder llamarlo. "bash -x" parece repetirse bien en OS X, pero eso podría deberse a las versiones de bash.

Linux: 3.2.25

OS X: 3.2.48

Aquí hay un extracto del comportamiento no recurrente en 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 cómo se obtiene /etc/profile.d/vim.sh, pero sus comandos no se imprimen. ¿Hay alguna solución alternativa sin actualizar? ¿Es esto causado por la diferencia de versión?

Kelvin
fuente

Respuestas:

1

set -xen algún lugar del archivo raíz (el que requiere todos los demás archivos) debería funcionar. Alternativamente, introduzca algo como [[ !-z "$DEBUG" ]] && set -xen cada archivo y llame con DEBUG=1 script.sh.

mkaito
fuente
¿Dónde está el archivo raíz? ¿Es independiente de la plataforma?
Kelvin
Con "archivo raíz" me refiero simplemente al archivo que está llamando en el shell y que está importando los otros archivos. En mi ejemplo, el archivo raíz sería script.sh
mkaito
1
Pero la inicialización de inicio de sesión bash ocurre antes de que se ejecute el script. Es demasiado tarde para ejecutar "set -x" en el script. Pruébelo usted mismo: ejecute "bash -l -x script.sh". Verá cosas que suceden antes de que se ejecuten los comandos de su script.
Kelvin
¿Por qué demonios ejecutarías un script bash -l? Eso está destinado a proyectiles interactivos. Un script no es un shell interactivo.
mkaito
3
Sea un poco más abierto de mente, obviamente los creadores de bash pensaron que sería útil. Veo 2 usos (al menos): 1) Desea ejecutarse ssh user@host 'bash -l -c command'para cargar el entorno adecuado. 2) Eres un administrador de sistemas y quieres resolver los problemas que están haciendo los scripts de inicio antes de que se ejecute tu script bash -l -x. A veces desea saber dónde se establece una variable env.
Kelvin
0

Como está obteniendo scripts y no ejecutándose, su primer comando en el script principal debe ser "set -x"

Ahora todos los scripts de origen se ejecutarán en depuración más. Recuerde que cuando genera un script, se ejecuta en su shell actual, por lo que si establece -x una vez, eso será bueno para todos los scripts de origen.

Sam
fuente