Ich möchte häufig relativ kurze Zeichenfolgendaten (könnte jedoch mehrere Zeilen umfassen) in Befehlszeilenprogramme einspeisen, die wiederholt nur Eingaben aus Dateien (z. B. wdiff) akzeptieren. Sicher kann ich eine oder mehrere temporäre Dateien erstellen, den String dort speichern und den Befehl mit dem Dateinamen als Parameter ausführen. Aber es sieht für mich so aus, als ob dieses Verfahren sehr ineffizient wäre, wenn tatsächlich Daten auf die Platte geschrieben werden, und es könnte der Platte auch mehr als nötig schaden, wenn ich dieses Verfahren viele Male wiederhole, z. wenn ich einzelne Zeilen langer Textdateien in wdiff einspeisen möchte. Gibt es eine empfohlene Möglichkeit, dies zu umgehen, indem Sie beispielsweise Pseudodateien wie Pipes verwenden, um die Daten vorübergehend zu speichern, ohne sie tatsächlich auf die Festplatte zu schreiben (oder sie nur zu schreiben, wenn sie eine kritische Länge überschreiten). Beachten Sie, dass wdiff zwei Argumente benötigt und es meines Wissens nach nicht möglich ist, die Daten mit etwas wie wdiff <"text"
zu füttern .
Akzeptierte Antwort:
Verwenden Sie eine benannte Pipe. Zur Veranschaulichung:
mkfifo fifo
echo -e "hello worldnnext linenline 3" > fifo
Das -e
weist echo an, das Newline-Escape richtig zu interpretieren (n
). Dies wird blockieren, dh Ihre Shell wird hängen bleiben, bis etwas die Daten aus der Pipe liest.
Öffnen Sie irgendwo und im selben Verzeichnis eine andere Shell:
cat fifo
Sie lesen das Echo, das die andere Schale freigibt. Obwohl die Pipe als Dateiknoten auf der Festplatte existiert, sind die Daten, die sie durchlaufen, dies nicht; alles spielt sich in der erinnerung ab. Sie können im Hintergrund (&
) das Echo.
Die Pipe hat einen 64k-Puffer (unter Linux) und blockiert wie ein Socket den Writer, wenn er voll ist, sodass Sie keine Daten verlieren, solange Sie den Writer nicht vorzeitig beenden.