Utwórz plik wirtualny, który w rzeczywistości jest poleceniem

18

Czy istnieje sposób na utworzenie pliku wirtualnego, na przykład odczyt z pliku, który faktycznie czyta z stdoutpolecenia; zapisywanie do pliku jest tak naprawdę zapisywaniem do stdinpolecenia?

Do tej pory kludowałem to za inotifywaitpomocą pliku, który wywołuje polecenie podczas modyfikacji pliku, pobierając go z pliku i zapisując do niego.

Nie podoba mi się, że inotifywaittrzeba go ciągle restartować (i muszę się upewnić, że zawsze działa). Używam tego pliku tylko dwa razy w tygodniu.

jsj
źródło

Odpowiedzi:

17

Być może szukasz nazwanej potoku .

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

Pisanie do potoku nie uruchamia programu nasłuchującego. Jeśli chcesz przetwarzać dane wejściowe w pętli, musisz uruchomić program nasłuchujący.

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

Zauważ, że wszystkie dane zapisywane do potoku są scalane, nawet jeśli istnieje zapis wielu procesów. Jeśli odczytywanych jest wiele procesów, tylko jeden pobiera dane. Dlatego rura może nie być odpowiednia do jednoczesnych sytuacji.

Nazwane gniazdo może obsługiwać równoczesne połączenia, ale wykracza to poza podstawowe skrypty powłoki.

Przy najbardziej skomplikowanych końcu skali są niestandardowe systemy plików , który pozwala zaprojektować i zamontować system plików, gdzie każdy open, writeitp wyzwala funkcję w programie. Minimalna inwestycja to kilkadziesiąt linii nieszablonowego kodowania, na przykład w Pythonie . Jeśli chcesz wykonywać polecenia tylko podczas odczytywania plików, możesz użyć scriptfs lub fuseflt .

Gilles „SO- przestań być zły”
źródło
3

Kilka rzeczy, o których należy pamiętać w odniesieniu do nazwanych potoków: Potok nie może - w przeciwieństwie do pliku - mieć wielu czytników. Po przeczytaniu jego zawartości zniknął. Musisz więc zapętlić, tzn. Będziesz musiał ciągle wypychać zawartość do pisarza.

Sam szukałem odpowiedzi na to pytanie, a jedyną rzeczą, jaką udało mi się wymyślić, jest skrypt oparty na bezpieczniku .

unixhacker2010
źródło
1

To, co opisujesz, jest zasadniczo plikiem specjalnym FIFO, patrz fifo(7). Są tworzone przez mkfifo(1), a następnie proces może je otworzyć pod Linuksem dla R / W (nie obsługują tego wszystkie systemy Unixy). Dwa niezależne procesy mogą następnie wykorzystać go do komunikacji.

vonbrand
źródło
0

Najprostszym sposobem na „Utworzenie pliku wirtualnego, który jest tak naprawdę poleceniem”, jest rozszerzenie systemu plików FUSE. Jest to bardzo łatwe w przypadku bibliotek takich jak fusepy.

Oto przykład systemu plików FUSE, który pozwala czytać pliki HTTP / HTTPS / FTP tak, jakby były obecne na twoim własnym Linux-ie. Możesz podobnie stworzyć coś, co uruchamia dowolne polecenie dla tego samego podczas odczytu.

Jeśli spojrzysz na kod źródłowy , to nie jest to prawie 50 wierszy kodu (z wyłączeniem kodu kodu źródłowego).

supersan
źródło