Ich kann zu einer Akte umleiten und T-Stück benutzen; auf einer grundlegenden Ebene. So
$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.
$ outanderr 1>file # redirect stdout to a file, display stderr
stderr
$ outanderr 2>file # redirect stderr to a file, display stdout
stdout
$ outanderr 1>file 2>&1 # redirect both to a file, display nothing
$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout
$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr
Die Frage ist, was anstelle der Fragezeichen zu schreiben ist, um die folgende Ausgabe zu erhalten:
$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr
Constaints:
- Vorausgesetzt, bash.
- Die Bestellung sollte in der Datei aufbewahrt werden.
- stderr-Inhalte werden zeilenweise in Echtzeit angezeigt, dh ohne Pufferung.
- Es können separate Skriptdateien verwendet werden.
- Magie kann notwendig sein.
bash
files
io-redirection
TWiStErRob
quelle
quelle
outanderr
Programm haben Sie?outanderr
ist nur ein Alias, der eine Zeile an stdout und eine andere an stderr ausgibt. Die Idee (wenn es möglich ist) ist, eine generische Lösung zu erstellen, die mit jedem Programm funktionieren kann, ohne sie zu ändern.Antworten:
Zum einfachen Testen:
Bearbeiten 1:
Dies funktioniert, indem stdout (nur) in die Datei geschrieben wird, sterr stdout so gemacht wird, dass es durch die Pipe geht, und tee seine Ausgabe in dieselbe Datei schreibt.
Beide Schreibvorgänge müssen im Anfügemodus (
>>
anstelle von>
) ausgeführt werden, da sich sonst beide Ausgaben gegenseitig überschreiben würden.Da die Pipe ein Puffer ist, kann nicht garantiert werden, dass die Ausgabe in der richtigen Reihenfolge in der Datei angezeigt wird. Dies würde sich auch dann nicht ändern, wenn eine Anwendung mit beiden Dateideskriptoren (zwei Pipes) verbunden wäre. Für eine garantierte Bestellung müssten beide Ausgänge denselben Kanal durchlaufen und jeweils markiert sein. Oder du brauchst ein paar wirklich ausgefallene Sachen:
/dev/null
. Die Ausgaben der Anwendung werden durch Durchlaufen getrenntstrace -f -s 32000 -e trace=write
. In diesem Fall müssten Sie die Fluchtung rückgängig machen. Es ist unnötig zu erwähnen, dass die Anwendung nicht schneller ausgeführt wird, wenn sie nachverfolgt wird.quelle
stdout
undstderr
nach sendentee
, oder vermisse ich etwas? Ich denke, die Anforderung des OP isttee
stderr
nur zu.