2012-06-22 9 views
6

Start bash mit Option -v erzeugt eine lange Ausgabe an die KonsoleKann bash -v-Ausgabe umgeleitet werden?

$ bash -v 

source ~/Dropbox/bin/tim_functions.sh 

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

Ich möchte die Ausgabe in einer Datei erfassen es leichter durchsuchen zu machen, aber ich habe bash -v 2>&1 > out_bash.txt und bash -v | tee out_bash.txt versucht und erfassen nicht die Informationen auf dem Terminalbildschirm in einer Datei. Es ist, als ob die ausführliche Ausgabe weder stderr noch stdout ist. Wie kann das sein?

Kann jemand vorschlagen, die Ausgabe von Bash-V zu erfassen?

Antwort

1

Nach der Lektüre anderen hilfreichen Antworten sein, ich glaube, das Problem mit dem zu tun hat, wie bash die ausführliche Informationen zu tty sendet - das ist, irgendwie anders als stderr oder stdout. Es kann mit der folgenden Arbeit umgefangen werden:

Dies führt dazu, dass eine Datei screenlog.0 erzeugt wird, die die Ausgabe enthält.

Die Ausgabe von Interesse -v bash war auf einem Mac 10.7.3 (Lion) mit

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

Ein weiterer 10.6.8 mac läuft Ich hatte eine weniger (interessante/verbose) Ausgabe versucht, trotz ähnlicher .bashrc-Datei.

0

Haben Sie versucht, Ihre Child Bash in einer Subshell zu verpacken?

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

Ich habe versucht, Ihren Vorschlag, aber kein Glück - immer noch die Informationen nicht erfassen. Es scheint, dass die Ausgabe von bash -v mit Debug-Informationen zusammenhängt. Und Debuginformationen scheinen weder stderr noch stdout zu sein. Ich fange an zu denken, dass es nicht vom Terminal umgeleitet werden kann. – Tim

+0

Bash ist nicht magisch; alles, was an Ihre tty gesendet wurde, kam aus dem Aufruf 'write()' (oder gleichwertig) von * irgendwo *. Was passieren kann, ist, dass die interaktive Shell selbst die Ausgabe erzeugt, während die Umleitung möglicherweise nur für erzeugte Child-Prozesse gilt. Aus diesem Grund dachte ich, dass das Wrappen einer Ebene und das Hochziehen der Weiterleitung funktionieren könnte. – phs

+0

Wenn Sie jedoch in einer Bash-Sitzung sind und bash -v ausführen, wird ein untergeordneter Prozess (die neue Bash-Sitzung) generiert. Wenn also der Elternprozess nicht die write() -Aufforderung für die Debuginformationen des untergeordneten Elements aufruft, sondern der untergeordnete Prozess selbst write() aufruft, scheint die Terminalinfo dennoch umleitbar zu sein. Aber vielleicht werden so Debug-Informationen erzeugt - der Elternteil überwacht irgendwie die Aktivitäten des Kindes und berichtet darüber. – Tim

4

ich stocherte und fand diese http://www.commandlinefu.com/commands/view/3310/run-a-bash-script-in-debug-mode-show-output-and-save-it-on-a-file

Auf der Website, die sie verwenden bash -x test.sh 2>&1 | tee out.test, aber ich getestet es mit bash -v test.sh 2>&1 | tee out.test und es funktionierte gut.

+0

Ich mache etwas ein wenig anders - ich versuche nur 'bash -v' nicht 'bash -v some_script.sh' zu laufen. Wenn Sie bash -v ausführen, erhalten Sie die Debug-Informationen beim Erstellen eines neuen untergeordneten Shell-Prozesses, anstatt einen neuen Prozess zu erstellen, der ein Skript ausführt. Es scheint, dass die Debug-Informationen in meinem Fall schwer zu fangen sind. Aber ich habe einen Weg gefunden - durch den Befehl screen (siehe Kommentar unten). Danke für Ihre Hilfe. – Tim

+0

@ pgreen2 thx, es funktioniert – sb32134

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

ist nicht das, was Sie wollen, sollte es

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

Sie können verwenden, bash-v 2> & 1 | tee file.txt oder bash -v 2> & 1 | grep SEARCH_STRING

3

Sie auch den Befehl exec im Skript verwenden können alle Ausgaben zu umleiten:

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