Sagen , dass ich einen Befehl haben , foo
die einen Dateinamen - Argument: foo myfile.txt
. Lies ärgerlicherweise foo
nicht von der Standardeingabe. Anstelle einer tatsächlichen Datei möchte ich das Ergebnis eines anderen Befehls übergeben (in Wirklichkeit pv
wird die Datei kategorisiert und eine Fortschrittsanzeige als Nebeneffekt ausgegeben).
Gibt es eine Möglichkeit, dies zu erreichen? Nichts in meiner Trickkiste scheint es zu tun.
( foo
In diesem Fall handelt es sich um ein PHP-Skript, das die Datei meines Erachtens sequentiell verarbeitet.)
Ich benutze Ubuntu und Bash
BEARBEITEN Entschuldigung für die etwas unklare Problembeschreibung, aber hier ist die Antwort, die das macht, was ich will:
pv longfile.txt | foo /dev/stdin
Sehr offensichtlich jetzt, wo ich es sehe.
Antworten:
Wenn ich weiß, was Sie richtig machen wollen, können Sie dies mit der Befehlsersetzungsfunktion von bash tun:
Dies entspricht in etwa dem, was die
mkfifo
-basierten Antworten vermuten lassen, mit der Ausnahme, dass die Bash die Details für Sie verwaltet (und dem Befehl nicht eine reguläre Named Pipe, sondern etwas wie / dev / fd / 63 übergeben wird). Möglicherweise können Sie dies auch noch direkter tun:quelle
pv inputfile.txt | foo /dev/stdin
ist genau das, was ich suchte, aber nicht zu denken.<(.)
arbeitete für mich. Ist diese Syntax im Bash-Handbuch dokumentiert? Ich verstehe, dass(.)
die Befehlsersetzung dokumentiert ist, aber nicht die Kombination mit<
erklärt wurde.mkfifo
.quelle
Diese Unix SE-Frage enthält eine Antwort, die zeigt, wie eine temporäre Named Pipe erstellt wird:
Shell Script mktemp, was ist die beste Methode, um temporäre Named Pipe zu erstellen?
Basierend auf den Antworten könnten Sie Folgendes tun:
Sie könnten dann die Pfeife beobachten mit:
Dann löschen Sie es, wenn Sie damit fertig sind.
quelle
Versuchen Sie es mit mkfifo.
Führen Sie in einer anderen Shell foo file_read_by_foo aus
quelle
xargs
scheint dafür gut zu funktionieren:quelle
pv
mehrmals laufen , jeweils mit einer oder mehreren Linienlongfile.txt
. Überhaupt nicht das, wonach ich hier strebe.