Windows Ausgabeströme umleiten

OP #2087365
Hi,
ich würde gern die Ausgabeströme eines Kommandozeilentools umleiten.
ich weiß, dass mit > oder 2> die ströme in verschiendene Dateien 
geleitet werden können. Mit 2>&1, kann stderr auf stdout gelenkt werden

mit | kann sie auf die Eingabe eines Prozessen gelenkt werden.

Ich hätte jetzt gerne jedoch den error-kanal vor der ausgabe auf stdout 
noch durch ein grep geschickt

also etwa
tool > file.txt 2| grep x 2>&1

es müsste also der errorkanal auf die Standardeingabe eines 2. Prozesses 
und von da (nun wäre es ja die Standardausgabe des 2. Prozesses) in den 
stdout des gemultiplext werden.
möglicherweise würde das automatisch passieren, wenn das pipen des 
error-Kanal funktionieren würde.
Moderator #2087755
Wenn ich dein Vorhaben richtig verstanden habe, geht es in der Bash so:
1
tool 2>&1 >file.txt | grep x

D.h. stdout von tool gelangt direkt in die Datei file.txt, stderr von
tool wird von grep gefiltert, das Ergebnis von grep wird als stdout auf
der Konsole angezeigt.

Da keine Syntaxelemente verwendet werden, die Windows nicht auch kennt,
könnte das auch dort funktionieren.
OP #2088100
hmm, ich versuchs grad auf meinem Privat PC nachzuvollziehen:

perl-script:
1
for( my $i=0;$i<500; ++$i)
2
{
3
  print STDOUT "stdout $i\n";
4
  print STDERR "stderr $i\n";
5
  sleep(1);
6
}

sobald ich versuche die Standardausgabe umzuleiten kommt gar nix mehr 
an.


Yalu X. schrieb:
> Wenn ich dein Vorhaben richtig verstanden habe, geht es in der Bash so:
> tool 2>&1 >file.txt | grep x
>
> D.h. stdout von tool gelangt direkt in die Datei file.txt, stderr von
> tool wird von grep gefiltert, das Ergebnis von grep wird als stdout auf
> der Konsole angezeigt.

werd ich morgen mal probieren.
Ich hätte aber erwartet, dass grep gar nix mehr bekommt, da ja alle 
ausgaben bereits umgeleitet sind. Die file operatoren haben Vorrang.

wenn man 'dir > test.txt | grep DIR' ausführt kommt aus dem grep auch 
nix mehr raus.
OP #2088500
Vlad Tepesch schrieb:
> sobald ich versuche die Standardausgabe umzuleiten kommt gar nix mehr
> an.

ok, das lag am fehlenden flushen des Ausgabepuffer.
1
local $| = 1;
2
for( my $i=0;$i<500; ++$i)
3
{
4
  print STDOUT "stdout $i\n";
5
  print STDERR "stderr $i\n";
6
  select(undef, undef, undef, .25);  # .25s warten
7
}

Yalu X. schrieb:
> tool 2>&1 >file.txt | grep x

ok, jetzt scheint die stdout in die Datei zu gehen und der stderr auf 
der stdout zu liegen, den grep verarbeitet, aber wie bekomme ich den 
Output jetzt mit in die file.txt gemultiplext.
Moderator #2088643
Vlad Tepesch schrieb:
> aber wie bekomme ich den
> Output jetzt mit in die file.txt gemultiplext.

Meinst du damit, dass das stdout und das gegreppte stderr am Ende
gemeinsam in file.txt stehen sollen? In der Bash geht das so:
1
{ tool 3>&2 2>&1 1>&3 | grep x; } >file.txt 2>&1

Die ersten drei Redirections vertauschen stdout und stderr. Das neue
stdout (also das ursprüngliche stderr) wird gegreppt. Am Schluss wird
die Ausgabe von grep mit dem stderr (also dem ursprünglichen stdout)
zusammengeführt.

Da grep als eigener Prozess läuft und die Daten an mehreren Stellen
zwischengepuffert werden, werden die am Schluss zusammengeführten
Datenströme nicht zeitlich korrekt ineinandergeschachtelt. Außerdem
müsstest du nachsehen, ob unter Windows die Gruppierung von Befehlen
mittels {} überhaupt möglich ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.