2012-06-27 3 views
27

Ich habe ein Bash-Skript, das set -x enthält. Ist es möglich, die Debug-Ausgaben dieses Skripts und alle seine Ausgaben in eine Datei umzuleiten? Idealerweise würde ich so etwas tun:umleiten alle Ausgabe in einem Bash-Skript bei Verwendung von Set-X

#!/bin/bash 
set -x 
(some magic command here...) > /tmp/mylog 
echo "test" 

und die in/tmp/mylog

+ echo test 
test 

Ausgabe erhalten, nicht in stdout.

+1

Siehe [diese Frage] (http://stackoverflow.com/questions/692000/how-do-i-write-stderr-to-a-file-while-using-tee-with-a-pipe). Es ist kein Duplikat, aber ich glaube, das sollte deine Frage beantworten. – vergenzt

Antwort

39

Das ist, was ich gerade gegoogelt habe, und ich erinnere mich diese vor einiger Zeit mit ...

Verwendung exec sowohl die Standardausgabe und Standardfehler aller Befehle in einem Skript zu umleiten:

#!/bin/bash 
logfile=$$.log 
exec > $logfile 2>&1 

weitere Umleitung Magie Advanced Bash Scripting Guide - I/O Redirection überprüfen.

Wenn Sie auch die Ausgabe und Debug auf dem Terminal in zusätzlich in der Protokolldatei sehen möchten, siehe redirect COPY of stdout to log file from within bash script itself.

Wenn Sie das Ziel der set -x Trace-Ausgabe unabhängig von normalen STDOUT und STDERR behandeln möchten, sehen bash storing the output of set -x to log file.

+0

Interessant. Wie kann ich diese Methode verwenden, um Fehler (stdout 2) in eine Logdatei zu erfassen und sie an stdout 2 zurückzugeben; also könnte Cron Fehlerbenachrichtigungen richtig mailen? –

+0

@JoeyT, sehen Sie, ob dies für Sie funktioniert: Sichern Sie den STDOUT, bevor Sie die Protokolldatei mit 'exec 3 <& 1' einrichten, und fügen Sie am Ende diese beiden Zeilen hinzu:' exec 1 <& 3 3 <& - 'und' cat $ $ .log' - dies sollte STDOUT wiederherstellen und fd 3 zum Säubern schließen. Basierend auf der ursprünglichen 'tldp'-Referenz und dieser [http://tldp.org/LDP/abs/html/ioredirintro.html](http://tldp.org/LDP/abs/html/ioredirintro.html) – nik

+0

@ JoeyT Ich habe die Antwort bearbeitet und zwei weitere hilfreiche Links hinzugefügt; Der erste sollte ausreichen, um zu erklären, wie Sie das tun können. –

11

die -x Ausgang geht auf stderr, tun Sie es so zu protokollieren:

set -x 
exec 2>/tmp/mylog 
Verwandte Themen