Come faccio a fare di nuovo "bash -x" (modalità debug) negli script di provenienza?


10

Sto cercando di eseguire il debug di ciò che fa bash sull'inizializzazione dell'accesso per Linux. Ho letto che "bash -x" farà stampare a bash ciò che sta facendo, ma non stampa i comandi nei file di origine come "set -x". Non riesco a usare "set -x" perché l'inizializzazione viene eseguita prima di poterla chiamare. "bash -x" sembra recidere bene su OS X, ma ciò potrebbe essere dovuto alle versioni bash.

Linux: 3.2.25

OS X: 3.2.48

Ecco un estratto del comportamento non ricorrente su 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 ...

Notare come /etc/profile.d/vim.sh proviene, ma i suoi comandi non vengono stampati. Esiste una soluzione alternativa senza aggiornare? Questo è causato dalla differenza di versione?

Risposte:


1

set -xda qualche parte nel file root (quello che richiede tutti gli altri file) dovrebbe funzionare. In alternativa, introdurre qualcosa di simile [[ !-z "$DEBUG" ]] && set -xin ogni file e chiamare con DEBUG=1 script.sh.


Dov'è il file root? È indipendente dalla piattaforma?
Kelvin,

Con "file root" intendo semplicemente il file che stai chiamando sulla shell e che sta importando gli altri file. Nel mio esempio, il file root sarebbe script.sh
mkaito

1
Ma l'inizializzazione dell'accesso bash avviene prima dell'esecuzione dello script. È troppo tardi per eseguire "set -x" nello script. Provalo tu stesso - esegui "bash -l -x script.sh". Vedrai cose accadere prima che vengano eseguiti i comandi del tuo script.
Kelvin,

Perché mai dovresti eseguire una sceneggiatura bash -l? Questo è pensato per shell interattive. Uno script non è una shell interattiva.
mkaito,

3
Per favore, sii un po 'più aperto - ovviamente i creatori di Bash hanno pensato che sarebbe stato utile. Vedo 2 usi (almeno): 1) Si desidera eseguire in ssh user@host 'bash -l -c command'modo da ottenere il giusto env caricato. 2) Sei un amministratore di sistema e vuoi risolvere i problemi degli script di init prima dell'esecuzione dello script bash -l -x: te lo mostreranno. A volte vuoi sapere dove viene impostata una variabile env.
Kelvin,

0

Poiché stai eseguendo il sourcing di script e non eseguendo, il tuo primo comando nello script principale dovrebbe essere "set -x"

Ora tutti gli script di origine verranno eseguiti nel debug di più. Ricorda che quando si genera uno script, questo viene eseguito nella shell corrente, quindi se si imposta -x una volta, ciò andrà bene per tutti gli script dei sorgenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.