PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Bash] Zwei Streams verschmelzen



Rapt0r
02.07.04, 15:01
Hallo!

Ich habe eine Frage zur bash.
Mit der Konstruktion
1>&2 laesst man den Stream vom StandardOutput mit dem des StandardErrors verschmolzen. Also liegen beide jetzt auf dem Stream des StandardErrors.
Um das zu pruefen habe ich folgendes versucht
time wc file 1>&2 2>wc.out. Als Ergebnis bekam ich aber leider nicht das erwartete, naemlich das beide, (die ja jetzt auf dem stderr-stream liegen) in das file geschrieben werden, stattdessen bekam ich ganz normal den Output auf mein Terminal geprintet.

Auch der Versuch mit dem Gegenbeispiel schlaegt fehl
time wc file 2>&1 >wc.out bei dem ja eingentlich die beiden Streams auf den des stdout gelegt werden sollten. Es wird nur der stderr auf dem Terminal gezeigt, der Stdout wird in das file wc.out geschrieben.

Hat jemand eine Erklaerung?

MfG und Danke im Voraus

Raptor

Jasper
02.07.04, 23:05
time wc file 2>&1 >wc.out

falsche reihenfolge, richtig ist:

time wc file >wc.out 2>&1

oder kürzer

time wc file &>wc.out

das mit der reihenfolge ist in der manpage von bash unter redirection erklärt.


-j

Rapt0r
03.07.04, 21:42
time wc file >wc.out 2>&1
Damit wird ja nun der stderr mit dem stdout verschmolzen.
Der Stream, der jetzt entstanden ist, liegt der jetzt auf dem stdout, oder ist es ein komplett neuer, der nicht 0,1 oder 2 ist.

Denn wenn er auf dem stdout liegen wuerde, dann wuerde ja der gesamte Stream in das file geschrieben.
Das passiert aber leider nicht. Auch bei deinem Beispiel wird der stderr auf dem terminal ausgegeben und der output von wc in dem file.

Wie ist das denn nun mit den Streams?

Jasper
04.07.04, 00:01
Damit wird ja nun der stderr mit dem stdout verschmolzen.
Der Stream, der jetzt entstanden ist, liegt der jetzt auf dem stdout, oder ist es ein komplett neuer, der nicht 0,1 oder 2 ist.


das ist stdout, sonst würde der redirect nicht funktionieren,



Denn wenn er auf dem stdout liegen wuerde, dann wuerde ja der gesamte Stream in das file geschrieben.
Das passiert aber leider nicht. Auch bei deinem Beispiel wird der stderr auf dem terminal ausgegeben und der output von wc in dem file.

Wie ist das denn nun mit den Streams?

wie ich sagte: ">file 2>&1" legt stderr auf stdout und leitet stdout in file:

$ ./a > a.log 2>&1
$ cat a.log
stderr
stdout

wobei der quelltext von a so aussieht:

$ cat a.c
#include <stdio.h>
int main(int argc, char** argv) {
fprintf(stdout,"stdout\n");
fprintf(stderr,"stderr\n");
}

zu deinem beispiel 'time wc file':

(time wc file >a.log 2>&1) >b.log 2>&1

das der redirect bei time probleme macht liegt an time. time taucht nicht in der prozessliste auf; das fork() was time macht scheint etwas merkwürdig zu sein.


-j