4 Stimmen

Wie kann ich die Ausgabe eines Programms, das nur in eine Datei (und nicht in STDOUT) schreiben kann, über die Pipeline leiten?

Ich versuche, etwas zu schreiben wie Perl Audio Konverter Ich muss also in der Lage sein, jedes relevante Audioformat nach wav (PCM) zu dekodieren und dann wav in jedes relevante Audioformat zu kodieren. Ich möchte dies parallel tun, indem ich den Ausgang des Decoders direkt an den Eingang des Encoders leite. Die meisten Decoder haben eine Option zur Dekodierung nach stdout, aber nicht alle. Einige bestehen auf der Ausgabe in eine Datei.

Meine Frage ist also, wie kann ich ein Programm, das nur in eine bestimmte Datei ausgibt, dazu bringen, stattdessen stdout zu verwenden? Und die ergänzende Frage: Wie kann ich ein Programm, das eine Eingabedatei benötigt, dazu bringen, von stdin zu lesen?

Wäre dies nicht möglich, weil das Programm möglicherweise innerhalb der Ausgabe vor- und zurücksuchen möchte?

Übrigens umgeht Perl Audio Converter dieses Problem, indem es immer eine wav-Zwischendatei verwendet, was bedeutet, dass es niemals parallel dekodiert und kodiert, auch nicht bei Formaten, die dies unterstützen.

PS: Ja, es gibt einen Grund, warum ich nicht einfach Perl Audio Converter verwenden möchte, aber der ist für die Frage nicht relevant.

3voto

Employed Russian Punkte 180738

Unter Linux können Sie /proc/self/fd/1 als "Datei"-Ausgabe.
Das sollte für jedes Programm funktionieren, das nicht versucht, in der Ausgabe zu suchen.

Einige Programme suchen in der Ausgabe (z.B. um eine Zusammenfassung an den Anfang der Datei zu schreiben, sobald die Dekodierung abgeschlossen ist), und diese Suche schlägt bei allem fehl, was keine echte Datei ist.

Wenn das Programm den Rückgabewert von fseek o lseek (wie es sein sollte), wird das Programm wahrscheinlich einen Fehler zurückgeben. Wenn nicht, wird es wahrscheinlich erfolgreich beendet, erzeugt aber eine fehlerhafte Ausgabe (z. B. mit einer falschen Zusammenfassung am Anfang und zusätzlichem "Müll" am Ende).

3voto

outis Punkte 71613

Einige Betriebssysteme, wie Unix-Varianten und die Win32-Familie, unterstützen benannte Rohre . Möglicherweise können Sie diese anstelle von stdout/stdin verwenden.

2voto

nos Punkte 214143

Erstellen Sie ein benanntes Rohr.

mkfifo /tmp/mypipe

Anstatt z.B.

echo foo | wc -c 

Sie können sie als Datei verwenden

echo foo > /tmp/myfifo &
wc -c /tmp/myfifo

(was auch immer zuerst gestartet wird, blockiert, bis das andere Ende des Rohrs geöffnet wird) Aber Sie haben Recht, wenn das Programm eine tatsächliche Datei benötigt, um z.B. zu suchen, wird dies nicht funktionieren.

1voto

Erstellen einer Pipe und Zuweisen der Ausgabe an die Pipe

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X