Buat file virtual yang sebenarnya adalah perintah

18

Apakah ada cara untuk membuat file virtual, sehingga membaca dari file sebenarnya membaca dari stdoutperintah; menulis ke file secara akut menulis ke stdinperintah?

Sejauh ini saya telah kludged ini dengan inotifywaitpada file, yang memanggil perintah ketika file tersebut dimodifikasi, mengambil input dari file dan menulis kembali ke sana.

Saya tidak suka bahwa inotifywaitharus terus-menerus dimulai kembali (dan saya harus memastikan bahwa itu selalu berjalan). Saya hanya menggunakan file ini mungkin dua kali seminggu.

jsj
sumber

Jawaban:

17

Anda mungkin mencari pipa bernama .

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

Menulis ke pipa tidak memulai program mendengarkan. Jika Anda ingin memproses input dalam satu lingkaran, Anda harus tetap menjalankan program mendengarkan.

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

Perhatikan bahwa semua data yang ditulis ke pipa digabungkan, bahkan jika ada beberapa proses penulisan. Jika banyak proses membaca, hanya satu yang mendapatkan data. Jadi pipa mungkin tidak cocok untuk situasi bersamaan.

Soket bernama dapat menangani koneksi bersamaan, tetapi ini di luar kemampuan untuk skrip shell dasar.

Pada akhir paling kompleks dari skala adalah filesystem kustom , yang memungkinkan Anda merancang dan me-mount filesystem di mana setiap open, write, dll, memicu fungsi dalam sebuah program. Investasi minimum adalah puluhan baris kode nontrivial, misalnya dengan Python . Jika Anda hanya ingin menjalankan perintah saat membaca file, Anda dapat menggunakan scriptfs atau fuseflt .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Beberapa hal yang perlu diperhatikan mengenai pipa bernama: Pipa tidak bisa - tidak seperti file - memiliki banyak pembaca. Setelah kontennya dibaca, konten itu hilang. Jadi Anda perlu mengulang, yaitu Anda harus terus mendorong konten ke dalam pipa dari penulis.

Saya sendiri sudah mencari jawaban untuk pertanyaan ini dan satu-satunya hal lain yang bisa saya dapatkan adalah skrip yang didasarkan pada sekering .

unixhacker2010
sumber
1

Apa yang Anda jelaskan pada dasarnya adalah file khusus FIFO, lihat fifo(7). Mereka diciptakan oleh mkfifo(1), dan suatu proses kemudian dapat membukanya di Linux untuk R / W (tidak semua sistem Unixy mengatasinya). Dua proses independen kemudian dapat menggunakannya untuk berkomunikasi.

vonbrand
sumber
0

Cara termudah untuk "Membuat file virtual yang sebenarnya adalah perintah" adalah memperluas sistem file FUSE. Sangat mudah dilakukan dengan perpustakaan seperti fusepy.

Berikut adalah contoh sistem file FUSE yang memungkinkan Anda membaca file HTTP / HTTPS / FTP seolah-olah mereka ada di kotak Linux Anda sendiri. Anda juga dapat membuat sesuatu yang menjalankan perintah apa pun untuk hal yang sama saat dibaca.

Jika Anda melihat kode sumbernya hampir tidak ada 50 baris kode (tidak termasuk kode boilerplate).

supersan
sumber