Wie leite ich die Standardausgabe in mehrere Protokolldateien um? Folgendes funktioniert nicht:
some_command 1> output_log_1 output_log_2 2>&1
Wie leite ich die Standardausgabe in mehrere Protokolldateien um? Folgendes funktioniert nicht:
some_command 1> output_log_1 output_log_2 2>&1
Antworten:
Siehe man tee
:
NAME: tee - von der Standardeingabe lesen und in die Standardausgabe und Dateien schreiben
ÜBERSICHT: tee [OPTION] ... [DATEI] ...
Entsprechend:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2
ich habe versucht, wie oben ausgeführt, aber ich muss Strg-C drücken, um es in die zweite Protokolldatei umzuleiten. Auch die Ausgabe wird auf der Konsole gedruckt. Ich möchte, dass die Befehlsausgabe in die Protokolle umgeleitet wird, aber nicht in die Konsole. Jede Hilfe wird gebeten.
tee
Befehl schreibt stdin
in Datei (en) und auch in stdout
. Wenn Sie nicht möchten, dass die Ausgabe auf dem Terminal angezeigt wird, müssen Sie sie wie gewohnt umleiten /dev/null
.
echo test | tee --append file1 file2
Angenommen, Ihre Ausgabe wird aus einer Funktion generiert cmd()
:
cmd() {
echo hello world!
}
Um die Ausgabe von cmd
in zwei Dateien, aber nicht in die Konsole umzuleiten , können Sie Folgendes verwenden:
cmd | tee file1 file2 >/dev/null
Dies funktioniert für mehrere Dateien, vorausgesetzt, alle Datenquellen werden an tee weitergeleitet:
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
Dies wird auch funktionieren:
echo $(cmd) | tee file1 file2 >/dev/null
Ohne die /dev/null
Umleitung sendet tee zusätzlich zu den angegebenen Dateien eine Ausgabe an stdout .
Wenn dies beispielsweise über die Konsole ausgeführt wird, wird die Ausgabe dort angezeigt. Auf einer Crontab ausgeführt, wird in der Ausgabe die Statusmeldung angezeigt, die an Sie gesendet wurde (siehe auch Gilles 'Antwort hier https://unix.stackexchange.com/a/100833/3998 ).
Dies funktionierte für mich in Bash auf Ubuntu 12.04 und wurde in Ubuntu 14.04 mit GNU Bash 4.3.11 (1) verifiziert, so dass es auf jeder aktuellen GNU Bash-Version funktionieren sollte.
version 4.3.11(1)-release (i686-pc-linux-gnu)
) in Ubuntu 14.04 getestet habe .
Es ist ein alter Beitrag, aber ich habe ihn gerade gefunden ...
Anstatt die Ausgabe an > /dev/null
umzuleiten, können Sie sie an die letzte Datei umleiten:
echo "foobarbaz" | tee file1 > file2
Oder zum Anhängen der Ausgabe:
echo "foobarbaz" | tee -a file1 >> file2
-a
in Abschlag)
Wie @jofel in einem Kommentar unter der Antwort erwähnt hat, kann dies nativ erfolgen in zsh
:
echo foobar >file1 >file2 >file3
oder mit Klammererweiterung:
echo foobar >file{1..3}
Intern funktioniert dies sehr ähnlich zu den oben angegebenen tee
Antworten. Die Shell verbindet die Standardausgabe des Befehls mit einem Prozess, der an mehrere Dateien weiterleitet. Daher gibt es keinen zwingenden technischen Vorteil, wenn man es so macht (aber es sieht wirklich gut aus). Weitere Informationen finden Sie im zsh
Handbuch .
Ein anderer Ausdruck ist jedoch nicht möglich
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
Könnte vereinfacht werden, wenn es um viele Dateien geht.
echo "foobarbaz" | tee file{1..8} > /dev/null
file1
Durchgang file8
als Namen wollen und dies wahrscheinlich nur beispielhafte Platzhalter für die Namen der Dateien sind
zsh
können Sie verwendensome_command >output_log_1 >output_log_2
.