C'è un modo per creare un file virtuale, in modo tale che la lettura del file legga effettivamente da stdout
di un comando; scrivere sul file è effettivamente scrivere su stdin
di un comando?
Finora l'ho combinato con un inotifywait
su un file, che chiama un comando quando il file viene modificato, prendendo l'input dal file e riscrivendolo.
Non mi piace che inotifywait
tuttavia, deve essere costantemente riavviato (e devo assicurarmi che sia sempre in esecuzione). Uso questo file solo forse due volte a settimana.
Risposta accettata:
Potresti cercare una pipe con nome.
mkfifo f
{
echo 'V cebqhpr bhgchg.'
sleep 2
echo 'Urer vf zber bhgchg.'
} >f
rot13 < f
La scrittura sulla pipe non avvia il programma di ascolto. Se vuoi elaborare l'input in un ciclo, devi 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 sono presenti più processi di scrittura. Se più processi stanno leggendo, 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 di shell di base.
All'estremità più complessa della scala ci sono i filesystem personalizzati, che ti consentono di progettare e montare un filesystem in cui ogni open
, write
, ecc., attiva una funzione in un programma. L'investimento minimo è di decine di righe di codifica non banale, ad esempio in Python. Se vuoi eseguire comandi solo durante la lettura dei file, puoi usare scriptfs o fuseflt.