PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stderr nach Pipe?



peschmae
23-08-2004, 10:52
Hallo, ich hab da ne Frage die ich bisher immer umgangen habe, die aber trotzdem ab und zu nervt.

Wie kriege ich den Stderr eines Programms in die Pipe ohne dass der Stdout da reingeschrieben wird. Der stdout soll auf dem Terminal ausgegeben werden.

Ich meine sowas in der Art (blödes Beispiel):


ls 2>| wc


als Output auf die Konsole möchte ich
1) die Ausgabe von ls auf den Stdout - also alle Dateien/Verzeichnisse
2) die ausgabe von wc - also die Zahl Wörter/Zeilen die auf den Stderr ausgegeben wurden

Leider macht obiges Beispiel nicht das - der Syntax ist meine Erfindung ;)

Ähnlich nett - bzw. aufs gleiche hinauslaufen wäre/würde folgendes:
VAR=$(ls)
wobei VAR jetzt irgendwie magischerweise den stderr von ls enthalt und nicht den Stdout

MfG Peschmä

fork
24-08-2004, 17:33
Zum ersten Problem:
Du möchtest also den Ausgabestrom eines Befehls einmal ausgegeben haben und zum anderen
durch wc verarbeitet haben, d. h. den Ausgabestrom duplizieren. Das einzige Kommando das ich
kenn das das macht ist tee. Damit aber nicht u. U. sehr grosse TMP-Dateien entstehen kann man
sehr praktische fifo Dateien verwenden. Befehle die als Dateien fifo-Dateien übergeben bekommen
warten bis Daten durch den anfangs leeren fifo-Puffer gereicht werden.


#!/bin/bash

FIFO=/tmp/$RANDOM.fifo
mkfifo $FIFO
wc $FIFO >&2 &
ls | tee $FIFO
rm $FIFO

Das zweite Problem ist sehr einfach:

ERROR=$(ls 2>&1 >/dev/null )
Wichtig dabei ist aber das die Umlenkung von Deskriptor 2 vor der von 1 ist sonst ist auch stderr in /dev/null.

peschmae
24-08-2004, 18:01
Kannst du mir das mit der Reihenfolge mal erklären? Bzw. einen Link posten wo steht wie das genau geht?
Die Dokus die ich kenne gehen diesbezüglich leider überhaupt nicht weit genug.

MfG Peschmä

fork
24-08-2004, 18:21
Das ist eigentlich ganz einfach:

ls 2>&1 >/dev/null 3>&1

Das Kommando wird von links nach rechts abgearbeitet. Heisst also: leite Deskriptor 2 nach dorthin um wohin auch Deskriptor 1 im Moment zeigt. Nächster Schritt: Leite FD 1 nach /dev/null um. (Damit hat FD 2 aber nix mehr zu tun., das ist jetzt bereits Schnee von gestern). Jetzt wird der FD 3(Was eine Fehlermeldung gibt das er nicht existiert) auf das Ziel vom FD 1 gesetzt (also /dev/null).

Dokumentation dazu? Ein paar Suchbegriffe die mir gerade so einfallen:

"Die 10 Schritte der Shell" command line parsing bash eingabeumlenkung redirection

tuNIxM1TUniX
24-08-2004, 19:16
ls 2>&1 >/dev/null
... gibt nur die Fehlermeldungen aus

Eine gute Doko zur Reihenfolge der E/A-Umleitung findest du z.B. hier: http://www.linuxfibel.de/eaumleitung.htm
(siehe auc forks Sig ;) )

peschmae
25-08-2004, 09:19
wohin auch Deskriptor 1 im Moment zeigt.

Ok, alles klar. Kleiner Denkfehler von mir - ich dachte die wären dann gekoppelt.

MfG Peschmä