Crea un file virtuale che in realtà è un comando


18

Esiste un modo per creare un file virtuale, in modo tale che la lettura del file in realtà legga dal stdoutdi un comando; la scrittura nel file sta scrivendo in modo preciso al stdindi un comando?

Finora l'ho risolto con un inotifywaitfile su, che chiama un comando quando il file viene modificato, prendendo il suo input dal file e riscrivendolo .

Non mi piace che inotifywaitdebba essere costantemente riavviato (e devo assicurarmi che sia sempre in esecuzione). Uso questo file solo due volte a settimana.

Risposte:


17

Forse stai cercando una pipa denominata .

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

La scrittura nella pipe non avvia il programma di ascolto. Se si desidera elaborare l'input in un ciclo, è necessario mantenere in esecuzione un programma di ascolto.

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

Si noti che tutti i dati scritti nella pipe vengono uniti, anche se ci sono più processi di scrittura. Se vengono letti più processi, solo uno ottiene i dati. Quindi un tubo potrebbe non essere adatto a situazioni simultanee.

Un socket denominato può gestire connessioni simultanee, ma questo va oltre le capacità degli script shell di base.

Alla fine più complessa della scala sono filesystem personalizzato , che permette di disegnare e montare un filesystem in cui ogni open, writeecc, attiva una funzione in un programma. L'investimento minimo è di decine di righe di codice non banale, ad esempio in Python . Se si desidera eseguire comandi solo durante la lettura di file, è possibile utilizzare scriptfs o fuseflt .


3

Alcune cose da tenere presenti riguardo alle named pipe: una pipe non può - diversamente da un file - avere più lettori. Una volta letto il contenuto, non c'è più. Quindi è necessario eseguire il loop, ovvero è necessario spingere costantemente il contenuto nella pipe dallo scrittore.

Ho cercato personalmente una risposta a questa domanda e l'unica altra cosa che sono riuscito a trovare è scriptfs che si basa su miccia .


1

Quello che descrivi è essenzialmente un file speciale FIFO, vedi fifo(7). Sono creati da mkfifo(1), e un processo può quindi aprirli sotto Linux per R / W (non tutti i sistemi Unixy lo gestiscono). Due processi indipendenti possono quindi utilizzarlo per comunicare.


0

Il modo più semplice per "Creare un file virtuale che in realtà è un comando" è estendere il filesystem FUSE. È molto facile da fare con le biblioteche come fusepy.

Ecco un esempio di un filesystem FUSE che ti consente di leggere i file HTTP / HTTPS / FTP come se fossero presenti sulla tua casella Linux. Allo stesso modo è possibile creare qualcosa che esegue qualsiasi comando per lo stesso in lettura.

Se guardi il codice sorgente non ci sono quasi 50 righe di codice (escluso qualsiasi codice di targa di caldaia).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.