Kann ich eine "Datei" erstellen, die beim Öffnen tatsächlich die Ausgabe eines Befehls ergibt?

359
LukeGT

Ich befand mich jetzt in einer Reihe von Situationen, in denen ich eine solche "Datei" haben möchte, die im Wesentlichen ein Skript ausführt, wenn es "geöffnet" wird, sodass ich die Ausgabe "lesen" kann.

Ich habe zum Beispiel möglicherweise eine Konfigurationsdatei in einem Projekt, die ich lokal verwenden möchte, aber aufgrund von Unterschieden in meinem Computer muss ich ein Sed oder Grep ausführen, damit es funktioniert. Die Konfigurationsdatei des Projekts wird noch verwaltet, und diese Änderungen werden in meiner lokalen Konfiguration angezeigt. Dies bedeutet, dass Sie das einfache tun, indem Sie es modifizieren und dann speichern. Dies ist nicht ideal, da es bei der Aktualisierung des Projekts leicht veraltet wird. Ich möchte, dass die Filterung jedes Mal erfolgt, wenn ich meine lokale Konfigurationsdatei öffne.

Gibt es einen Weg für mich, so etwas zu erreichen? Ich weiß, dass das virtuelle Dateisystem es Ihnen ermöglicht, einige ziemlich verrückte Dinge als "Dateien" erscheinen zu lassen. Ich habe das Gefühl, dass dies nicht außerhalb des Möglichenbereiches liegt.

4
Das Problem, das Sie haben, ist, dass Sie gleichzeitig in die Datei schreiben müssen, in der sie gelesen wird. Was Sie benötigen, ist ein Programm, um die Datei auf diesen Monitoren zu öffnen, wenn sich Ihre Datei ändert. Das Hauptproblem ist, dass sich der Inhalt der Datei im Speicher befindet und wenn sich etwas auf der Festplatte ändert, welche ist dann die richtige, korrekte Version der Datei? Kinnectus vor 9 Jahren 0
Ich versuche, dieses ganze Rätsel zu vermeiden, indem ich niemals eine geschriebene, gefilterte Datei habe. Stattdessen wird der Befehl jedes Mal ausgeführt, wenn ich auf die "Datei" zugreife, und der Inhalt der "Datei" ist jedes Mal die Ausgabe dieses Befehls. Die Ausgabe des Befehls trifft niemals wirklich auf die Festplatte. LukeGT vor 9 Jahren 0
Ich denke, es wäre für Ihr Skript einfacher, es auszuführen und die Ergebnisse einfach in eine neue Datei (für Ihr neues Ini) zu übertragen. Ihr Skript kann sed oder grep sein, und Sie können die verschiedenen Such- und Filterwerkzeuge verwenden, um sicherzustellen, dass Ihre Ausgabedatei korrekt formatiert ist. Kinnectus vor 9 Jahren 0
Ich bin mir dessen bewusst, dass ich das tun kann, aber diese Lösung erfordert jedes Mal einen manuellen Eingriff, wenn sich die Originaldatei ändert. Dadurch kann die gefilterte Version leicht veraltet werden, wenn ich nicht aufmerksam bin. LukeGT vor 9 Jahren 0
Es ist sicherlich nicht perfekt, aber die einfachste Lösung wäre wahrscheinlich, einfach einen Cron-Job einzurichten, der in regelmäßigen Abständen die erforderlichen Filter für die Remote-Datei ausführt und in Ihre lokale Datei ausgibt. Vorausgesetzt, es ist nicht sehr kompliziert oder zeitintensiv, kann es sogar jede Minute ausgeführt werden, um Ihre Datei auf dem neuesten Stand zu halten. daenris vor 9 Jahren 1

1 Antwort auf die Frage

4
PioneerAxon

Theoretisch ist dies mit LD_PRELOAD mit dem gewünschten Programm möglich.

Schreiben Sie eine Bibliothek, um einen Wrapper über "offene" Systemaufrufe hinzuzufügen, und verwenden Sie das Originalprogramm (etwa cat) als LD_PRELOAD=/path/to/library cat.

Der overridden_open () - Code in der Wrapper-Bibliothek würde dem folgenden Dummy-Code ähneln.

/* This is an illustrative code, and doesn't follow any good coding practice. */ int overridden_open (...) { /* Only do this for the config file. */ if (strcmp (filename, "/path/to/required/config/file") == 0) { /* Download a fresh copy, and if successful, overwrite the existing file. */ if (system ("wget -O /path/to/required/config/file.tmp http://remote.file/url") == 0 && system ("<perform awk/sed/grep operations>") == 0) { system ("mv /path/to/required/config/file.tmp /path/to/required/config/file"); } } return open (...); }