Erstellen Sie eine virtuelle Datei, die eigentlich ein Befehl ist

18

Gibt es eine Möglichkeit, eine virtuelle Datei zu erstellen, sodass das Lesen aus der Datei tatsächlich aus dem stdouteines Befehls stammt? Schreiben in die Datei ist tatsächlich das Schreiben in stdineinen Befehl?

Bisher habe ich dies mit einer inotifywaiton-Datei gekludert , die einen Befehl aufruft, wenn die Datei geändert wird, die Eingabe aus der Datei nimmt und zurückschreibt.

Ich mag es nicht, dass das inotifywaitständig neu gestartet werden muss (und ich muss sicherstellen, dass es immer läuft). Ich benutze diese Datei vielleicht nur zweimal pro Woche.

jsj
quelle

Antworten:

17

Möglicherweise suchen Sie nach einer Named Pipe .

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f

Das Schreiben in die Pipe startet das Hörprogramm nicht. Wenn Sie Eingaben in einer Schleife verarbeiten möchten, müssen Sie ein Hörprogramm ausführen.

while true; do rot13 <f >decoded-output-$(date +%s.%N); done

Beachten Sie, dass alle in die Pipe geschriebenen Daten zusammengeführt werden, auch wenn mehrere Prozesse geschrieben werden. Wenn mehrere Prozesse gelesen werden, erhält nur einer die Daten. Daher ist eine Pipe möglicherweise nicht für gleichzeitige Situationen geeignet.

Ein benannter Socket kann gleichzeitige Verbindungen verarbeiten, dies geht jedoch über die Funktionen für einfache Shell-Skripts hinaus.

Am komplexesten Ende der Skala sind benutzerdefinierte Dateisysteme , die Sie ein Dateisystem entwerfen und montieren lassen , wo jeder open, writeusw., eine Funktion in einem Programm auslöst. Die Mindestinvestition liegt in zig Zeilen nichttrivialer Codierung, beispielsweise in Python . Wenn Sie beim Lesen von Dateien nur Befehle ausführen möchten, können Sie scriptfs oder fuseflt verwenden .

Gilles 'SO - hör auf böse zu sein'
quelle
3

Einige Dinge, die in Bezug auf Named Pipes beachtet werden müssen: Eine Pipe kann - anders als eine Datei - nicht mehrere Leser haben. Sobald der Inhalt gelesen wurde, ist er verschwunden. Sie müssen also eine Schleife ausführen, dh, Sie müssen ständig Inhalte vom Writer in die Pipe schieben.

Ich habe selbst nach einer Antwort auf diese Frage gesucht und das einzige andere, was mir eingefallen ist, sind Skripte, die auf Fuse basieren .

unixhacker2010
quelle
1

Was Sie beschreiben, ist im Wesentlichen eine FIFO-Spezialdatei, siehe fifo(7). Sie werden von erstellt mkfifo(1)und können dann von einem Prozess unter Linux für R / W geöffnet werden (nicht alle Unixy-Systeme verarbeiten dies). Zwei unabhängige Prozesse können dann damit kommunizieren.

vonbrand
quelle
0

Der einfachste Weg, um "eine virtuelle Datei zu erstellen, die eigentlich ein Befehl ist", besteht darin, das FUSE-Dateisystem zu erweitern. Es ist sehr einfach, mit Bibliotheken wie Fusepy umzugehen.

Hier ist ein Beispiel für ein FUSE-Dateisystem, mit dem Sie HTTP / HTTPS / FTP-Dateien lesen können, als wären sie auf Ihrer eigenen Linux-Box vorhanden. Sie können auf ähnliche Weise etwas erstellen, das beim Lesen einen beliebigen Befehl für denselben ausführt.

Wenn Sie sich den Quellcode ansehen, sind es kaum 50 Codezeilen (ohne Boilerplate-Code).

supersan
quelle