2012-06-22 11 views
6

bash partendo -v opzione produce una lunga uscita alla consoleÈ possibile reindirizzare l'output di bash -v?

$ bash -v 

source ~/Dropbox/bin/tim_functions.sh 

\#!/bin/bash 
...several hundred more lines 

Vorrei catturare l'output in un file per rendere più facile da sfogliare, ma ho cercato bash -v 2>&1 > out_bash.txt e bash -v | tee out_bash.txt e non riesco a catturare le informazioni sullo schermo del terminale all'interno di un file. È come se l'output dettagliato non fosse né stderr né stdout. Come può essere?

Qualcuno può suggerire un modo per acquisire l'output di bash -v?

risposta

1

Dopo aver letto le risposte utili, credo che questo problema ha a che fare con il modo in bash sta inviando le informazioni verbose a tty - che è in qualche modo diverso da stderr o stdout. Può essere colto con il seguente lavoro:

$ screen -L 
$ bash -v 
$ exit #from the bash session 
$ exit #from the screen session 

Ciò genera un file screenlog.0 che viene generato contenente l'output.

uscita La bash -v di interesse era in un Mac 10.7.3 (Lion) con

$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11) 
Copyright (C) 2007 Free Software Foundation, Inc.) 

Un'altra 10.6.8 mac ho provato aveva una inferiore (dettagliato/interessante) di uscita, nonostante una simile .bashrc file.

0

Hai provato a racchiudere il figlio bash in una subshell?

(bash -v) 2>&1 > out_bash.txt 
+0

ho provato il tuo suggerimento, ma senza fortuna - ancora non cattura le informazioni. Sembra che l'output di bash -v sia correlato alle informazioni di debug. E le informazioni di debug non sembrano essere né stderr né stdout. Sto iniziando a pensare che non possa essere reindirizzato dal terminale. – Tim

+0

Bash non è magico; qualsiasi cosa inviata al tuo tty è uscita dalla chiamata 'write()' (o equivalente) da * somewhere *. Quello che potrebbe accadere è che la shell interattiva stia producendo l'output, mentre il reindirizzamento può essere applicato solo ai processi figli generati. Questo è il motivo per cui ho pensato che il wrapping di un livello e il sollevamento del reindirizzamento potrebbero funzionare .. – phs

+0

Ma quando sei in una sessione di bash ed esegui bash -v, questo genera un processo figlio (la nuova sessione di bash). Quindi, a meno che il processo genitore non stia effettuando le chiamate write() per le informazioni di debug del bambino, piuttosto che il processo figlio che chiama write() stesso, sembra ancora che le informazioni sul terminale debbano essere reindirizzate. Ma forse è così che vengono generate le informazioni di debug: il genitore controlla in qualche modo l'attività del bambino e le relazioni su di esso. – Tim

4

ho curiosato e ho trovato questo http://www.commandlinefu.com/commands/view/3310/run-a-bash-script-in-debug-mode-show-output-and-save-it-on-a-file

Sul sito usano bash -x test.sh 2>&1 | tee out.test, ma ho provato con bash -v test.sh 2>&1 | tee out.test e ha funzionato bene.

+0

Tuttavia, sto facendo qualcosa di leggermente diverso: sto provando a eseguire solo "bash -v" e non "bash -v some_script.sh". L'esecuzione di bash -v fornisce alle informazioni di debug la creazione di un nuovo processo figlio shell piuttosto che la creazione di un nuovo processo che esegue uno script. Sembra che le informazioni di debug siano difficili da individuare nel mio caso. Ma ho trovato un modo - usando il comando screen (vedi commento sotto). Grazie per l'aiuto. – Tim

+0

@ pgreen2 thx, funziona – sb32134

6
bash -v 2>&1 > out_bash.txt 

non è ciò che si vuole, dovrebbe essere

bash -v >out_bash.txt 2>&1 
0

È possibile utilizzare, bash -v 2> & 1 | tee file.txt o bash -v 2> & 1 | grep SEARCH_STRING

3

è anche possibile utilizzare il comando exec nello script per reindirizzare tutto l'output:

#!/bin/bash 
exec >> out.txt 2>> out.txt 
set -x 
set -v 
echo "testing debug of shell scripts" 
ls 
Problemi correlati