Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Stderr nach Pipe?

  1. #1
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549

    Stderr nach Pipe?

    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):
    Code:
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    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.

    Code:
    #!/bin/bash
    
    FIFO=/tmp/$RANDOM.fifo
    mkfifo $FIFO
    wc $FIFO >&2 &
    ls | tee $FIFO
    rm $FIFO
    Das zweite Problem ist sehr einfach:
    Code:
    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.
    Geändert von fork (24-08-2004 um 18:41 Uhr)

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    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
    Geändert von fork (24-08-2004 um 19:35 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    06.08.2004
    Beiträge
    22
    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 )

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von fork
    wohin auch Deskriptor 1 im Moment zeigt.
    Ok, alles klar. Kleiner Denkfehler von mir - ich dachte die wären dann gekoppelt.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •