Diskussion:Standard-Datenströme
Ausgabeumleitung, Super-tee
BearbeitenWeiß zufällig jemand, wie ich in einer Windows-DosBox sowohl stdout als auch stderr getrennt in jeweils eine Datei umleite, aber trotzdem gleichzeitig auf den Bildschirm ausgebe? Bisher verwende ich eine Umleitung mittels tee:
myProgram.exe 2>&1 | tee.exe logfile.txt
Damit landen stdout und stderr von myProgram.exe sowohl im logfile.txt als auch auf dem Bildschirm. Ich möchte aber, dass stdout in logfile_stdout.txt landet, stderr in logfile_stderr.txt, und trotzdem beides noch auf dem Bildschirm angezeigt wird. Gesucht ist also ein "Super-tee.exe", das auch stderr entgegennimmt und verarbeiten kann. Bisher bin ich auf folgendes gekommen:
myProgram.exe 1> logfile_stdout.txt 2> logfile_stderr.txt && type logfile_stdout.txt && type logfile_stderr.txt
Dabei geht leider die Reihenfolge von stdout- und stderr-Meldungen flöten. Hat jemand 'ne bessere Idee? --129.247.247.238 10:44, 25. Jan. 2011 (CET)
Mängel des Artikels
BearbeitenAn diesem Artikel stimmen bestenfalls die Zeilenvorschübe - und die sind vermutlich auch falsch.
Sehen wir mal davon ab, daß ein "Stream" in C++ nichts mit <stdout> unter Unix zu tun hat und daß der Satz "auch unter Python kann auf die Standard-Datenströme zugegriffen werden" genau gar nichts bedeutet: na sicher kann so ziemlich jede (nicht-spezialisierte) Programmiersprache irgendwas ausgeben, sonst wäre ihr Nutzen ziemlich beschränkt. Na, sowas!
Hingegen schießt die Einleitung echt den Vogel ab:
- Die Standard-Datenströme (englisch: standard streams) sind drei Datenströme für die Ein- und Ausgabe im Betriebssystem Unix oder in verwandten Betriebssystemen. Sie werden auch von der Standard C Library unterstützt. Viele Programme verwenden automatisch die Standardein- bzw. Standardausgabe, wenn auf der Kommandozeile keine Dateien für die Ein- oder Ausgabe angegeben werden.
Erstens: Das sind keine "Datenströme", sondern I/O-Deskriptoren, genauer gesagt, "file descriptors", also das, was etwa unter DOS/Windows einem "file handle" entspricht! Ein "Datenstrom" ist hingegen das, was entsteht, wenn man einen dieser I/O-Deskriptoren dazu benutzt, tatsächlich was auszugeben!
Zweitens: "Programme" verwenden solche Deskriptoren keineswegs, sondern "Prozesse"! Wenn ich dasselbe Program zweimal gleichzeitig laufen lasse, dann kann zwar jeder dieser beiden Prozesse auf stdout schreiben, aber das sind zwei UNTERSCHIEDLICHE Ziele, denn stdout des einen Prozesses ist nicht dasselbe wie stdout des anderen. Die können möglicherweise auf demselben Bildschirm (oder derselben Datei) landen, aber zunächst mal gehen sie getrennte Wege.
Drittens und wichtigstens: Nicht "viele Programme" verwenden die Standardein- und -ausgabe, sondern ALLE! Und zwar nicht nur dann, wenn "auf der Kommandozeile keine Dateien" angegeben werden, sondern immer! Es ist nur so, daß etwa <stdout> im Grundzustand auf das Terminal (das ist üblicherweise die Datei /dev/ttyX, wobei X irgendeine Nummer ist) zeigt und alles, was auf stdout ausgegeben wird, deshalb dort landet. Gibt man hingegen einen Dateinamen an, dann wird stdout mit dieser Datei verbunden und die Ausgabe landet dort. Analog mit Redirection, Pipelining und dergleichen mehr.