2011-09-26 20 views
7

Ho un sacco di script di shell che utilizzavano alcuni comandi e altri strumenti.Come recuperare tutti gli strumenti utilizzati nello script di shell

Quindi c'è un modo per elencare tutti i programmi che utilizzano gli script della shell? Tipo di metodo per recuperare le dipendenze dal codice sorgente.

+0

La tua domanda non è chiaro, ad esempio, "analizzare uno strumento" non è significativa. Stai cercando una lista di programmi usati dal tuo script? O una lista di programmi che usano i tuoi script? –

+0

Domanda aggiornata. Sto cercando l'elenco dei programmi che utilizza lo script di shell. – deimus

risposta

2

Utilizza sed di tradurre tubi e $( a ritorni a capo, quindi utilizza awk per emettere la prima parola di una linea se potrebbe essere un comando. I tubi in which per trovare parole di comando potiential nel PATH:

sed 's/|\|\$(/\n/g' FILENAME | 
awk '$1~/^#/ {next} $1~/=/ {next} /^[[:space:]]*$/ {next} {print $1}' | 
sort -u | 
xargs which 2>/dev/null 
2

Un modo per farlo è in fase di esecuzione. È possibile eseguire lo script di bash in debug mode con l'opzione -x e quindi analizzare l'output. Tutti i comandi eseguiti più i loro argomenti verranno stampati sullo standard output.

+0

bash --rpm-requires lo fa in un modo più leggibile dall'uomo ... non sai l'opzione per farlo senza eseguire lo script? – deimus

+0

Non penso che tu possa farlo in modo affidabile senza eseguire lo script. [Qui] (http://stackoverflow.com/questions/3926918/determine-function-and-file-dependency-of-a-shell-script/3928062#3928062) l'unico strumento che ho trovato che probabilmente potrebbe farlo. – ks1322

1

Mentre non ho soluzione generale, si potrebbe provare due approcci:

  1. Si potrebbe utilizzare strace per vedere quali programmi sono stati eseguiti dallo script.
  2. È possibile eseguire il programma in un ambiente pbuilder e vedere quali pacchetti mancano.
0

A causa della natura dinamica della shell, non è possibile farlo senza eseguire uno script.

Ad esempio:

TASK="cc foo.c" 
time $TASK 

Questo sarà davvero difficile determinare senza correre che cc è stato chiamato anche in tale esempio banale come sopra.

In un runtime, è possibile controllare l'output di debug sh -x myscript come indicato da thiton (+1) e ks1322 (+1). Puoi anche usare lo strumento come strace per catturare tutte le syscalls exec().

Problemi correlati