staging.inyokaproject.org

Bash-Ausgabe per Exec umleiten und zusätzlich einzelne Ausgaben in Datei schreiben

Status: Gelöst | Ubuntu-Version: Server 20.04 (Focal Fossa)
Antworten |

whisky2011

Anmeldungsdatum:
19. August 2011

Beiträge: 70

Hallo zusammen,

ich bin etwas ratlos und brauche eure Hilfe: Ich habe ein Bash-Script, dass die Ausgabe per Exec komplett in ein Logfile schreibt. Ich möchte aber, dass einzelne Befehle zusätzlich das Ergebnis auch nochmal in eine Datei schreiben (hier als Beispiel soll das Ergebnis von ls in eine Datei.

1
2
3
4
5
6
7
8
9
#!/bin/bash
exec > >(tee -i ${LOG})
exec 2>&1

echo "Das hier kommt ins Logfile"
echo "Das hier auch"
ls /oder/irgendein/anderer/befehl > ~/ergebnisdatei.txt
echo "Der Rest kommt wieder ins Logfile"
echo "Und dann ist Ende"

Habt ihr eine Idee, wie ich das anstellen kann? So wie hier im Beispiel funktioniert es nämlich nicht. Das Logfile wird korrekt geschrieben, aber die Datei bleibt leer. Und jede Zeile einzeln (1>&2 usw.) ausleiten finde ich unglücklich.

Danke im Voraus und viele Grüße whisky

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Hm, die Variable $LOG ist in dem Skript ja gar nicht definiert. Ansonsten sieht das eigentlich gut aus. Nur zum Vergleich: Ich verwende in enem Skript so etwas, was wunderbar funktioniert:

# Also write the output to logfile
LogFile="mylog.log"
exec > >(tee -a $LogFile)
exec 2>&1

whisky2011

(Themenstarter)

Anmeldungsdatum:
19. August 2011

Beiträge: 70

Sorry, mein Fehler! Ist hier beim reinstellen verloren gegangen. Der Exec-Teil funktioniert auch einwandfrei. Aber ich würde zusätzlich gerne noch einzelne Teile in eine zusätzliche Datei ausgeben. Siehe hier Zeile 7. Und das funktioniert leider nicht ☹

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

whisky2011 schrieb:

Habt ihr eine Idee, wie ich das anstellen kann?

Ich würde es vermeiden die Dateideskriptoren für stdout und stderr zu überschreiben (davon sollte man wenigstens eine Kopie erstellen, wenn man die später noch braucht) - man könnte den Code, dessen Ausgaben geloggt werden sollen z.B. auch in eine Inline Group packen und deren Ausgabe umleiten:

1
2
3
4
5
6
7
8
9
#!/bin/bash
LOG=/tmp/test.log
{
echo "Das hier kommt ins Logfile"
echo "Das hier auch"
ls /oder/irgendein/anderer/befehl 2>&1 | tee ~/ergebnisdatei.txt
echo "Der Rest kommt wieder ins Logfile"
echo "Und dann ist Ende"
} 2>&1 | tee -i ${LOG}

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Ah, sehr guter Hinweis, besten Dank! Ich stand letztens nämlich quasi vor dem gleichen Problem und wusste nicht, wie ich das lösen soll...

whisky2011

(Themenstarter)

Anmeldungsdatum:
19. August 2011

Beiträge: 70

Super! Danke!!!

Das löst zum einen das Problem mit der gesonderten Ausgabe für eine Zeile, zum anderen hab ich gleich wieder was dazugelernt, um meine Bash-Scripte zu verbessern. Danke vielmals für die schnelle Hilfe!

Antworten |