Ich habe ein Shell-Skript mit set -x
ausführlicher / Debug-Ausgabe:
#!/bin/bash
set -x
command1
command2
...
Die Ausgabe sieht folgendermaßen aus:
+ command1
whatever output from command1
+ command2
whatever output from command2
Mein Problem ist, der Shell - Ausgang (durch set -x
) geht zum Stderr, mit der Ausgabe der Befehle vermischen ( command1
, command2
, ...). Ich würde mich freuen, wenn die "normale" Ausgabe auf dem Bildschirm (wie das Skript ohne ausgeführt würde set -x
) und die "zusätzliche" Ausgabe von bash separat in einer Datei wären .
Deshalb möchte ich Folgendes auf dem Bildschirm haben:
whatever output from command1
whatever output from command2
und dies in einer Protokolldatei:
+ command1
+ command2
(Auch in Ordnung, wenn die Protokolldatei alles zusammen hat)
Die set -x 2> file
offensichtlich nehmen doens't die richtige Wirkung, weil es nicht die Ausgabe des Befehls set, aber es das Verhalten der bash ändern.
Das Verwenden bash 2> file
für das gesamte Skript ist auch nicht richtig, da es den stderr jedes Befehls umleitet, der auch in dieser Shell ausgeführt wird, sodass die Fehlermeldung der Befehle nicht angezeigt wird.
quelle
Antworten:
Auf der Grundlage dieser ServerFault Antwort Senden bash -x Ausgabe Logfile ohne Standardausgabe interupting , sind moderne Versionen von bash ein
BASH_XTRACEFD
speziell für die Angabe eines alternativen Dateideskriptor für die Ausgabeset -x
So können Sie zum Beispiel tun
Senden der Ausgabe
set -x
in eine Dateilogfile
unter Beibehaltung der regulären Standardausgabe und der Standardfehlerströme für die folgenden Befehle.Beachten Sie, dass die Verwendung von fd 19 willkürlich ist - es muss nur ein verfügbarer Deskriptor sein (dh nicht 0, 1, 2 oder eine andere Nummer, die Sie bereits zugewiesen haben).
quelle
Nach mehr als einem Jahr habe ich die richtige Lösung gefunden, um sowohl die "normale" Ausgabe (stdout + stderr - bash trace) als auch alle zusammen (stdout + stderr + bash trace) in einer Datei (bash.log) anzuzeigen. :
quelle
Steeldriver gab Ihnen einen Ansatz. Alternativ können Sie STDERR einfach in eine Datei umleiten:
Dies bedeutet jedoch, dass sowohl die von der
set -x
Option erstellte Ausgabe als auch alle anderen Fehlermeldungen in die Datei geschrieben werden. Die Lösung von Steeldriver leitet nur dieset -x
Ausgabe um, die wahrscheinlich Ihren Wünschen entspricht .quelle