Aslında bir komut olan bir sanal dosya oluşturun


18

Sanal bir dosya oluşturmanın herhangi bir yolu var, öyle ki dosyadan okumak aslında stdoutbir komuttan okur ; dosyaya yazma aslında stdinbir komutun yazıyor mu?

Şimdiye kadar bunu inotifywaitbir dosyada kludged , dosya değiştirildiğinde bir komut çağırıyor, dosyadan girdi alıp ona geri yazıyorum.

inotifywaitYine de sürekli olarak yeniden başlatılması gerektiğini sevmiyorum (ve her zaman çalıştığından emin olmak zorundayım). Bu dosyayı sadece haftada iki kez kullanıyorum.

Yanıtlar:


17

Adlandırılmış bir kanal arıyor olabilirsiniz .

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

Boruya yazmak dinleme programını başlatmaz. Girişi bir döngüde işlemek istiyorsanız, bir dinleme programını çalışır durumda tutmanız gerekir.

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

Boruya yazılan tüm verilerin, birden çok işlem yazma işlemi olsa bile birleştirildiğini unutmayın. Birden çok işlem okunuyorsa, yalnızca bir tanesi verileri alır. Dolayısıyla bir boru eşzamanlı durumlar için uygun olmayabilir.

Adlandırılmış bir soket eşzamanlı bağlantıları işleyebilir, ancak bu temel kabuk komut dosyalarının yeteneklerinin ötesindedir.

Ölçeğin en karmaşık sonunda olan özel dosya sistemleri her bir dosya sistemi tasarlamak ve monte sağlar, open, writevb bir programda bir işlevi tetikler. Minimum yatırım, örneğin Python'da onlarca önemsiz kodlama satırıdır . Komutları yalnızca dosyaları okurken yürütmek istiyorsanız, scriptfs veya fuseflt kullanabilirsiniz .


3

Adlandırılmış kanallarla ilgili bilinmesi gereken bazı şeyler: Bir kanalın - bir dosyadan farklı olarak - birden fazla okuyucusu olamaz. İçeriği okunduğunda gitti. Bu yüzden döngü yapmalısınız, yani içeriği sürekli olarak yazardan boruya itmeniz gerekir.

Bu soruya kendim bir cevap arıyorum ve ortaya koyabildiğim diğer tek şey , sigortaya dayalı scriptfs .


1

Açıkladığınız şey aslında bir FIFO özel dosyasıdır, bkz fifo(7). Bunlar tarafından oluşturulur mkfifo(1)ve daha sonra bir işlem bunları R / W için Linux altında açabilir (tüm Unixy sistemleri buna uymaz). Daha sonra iki bağımsız süreç bunu iletişim kurmak için kullanabilir.


0

"Aslında bir komut olan bir sanal dosya oluşturmak" için en kolay yol FUSE dosya sistemini genişletmektir. Ürpertici gibi kütüphanelerle yapmak çok kolay.

İşte HTTP / HTTPS / FTP dosyalarını kendi Linux kutunuzda varmış gibi okumanızı sağlayan bir FUSE dosya sistemi örneği . Benzer şekilde, okuma sırasında aynı komut için herhangi bir komutu çalıştıran bir şey oluşturabilirsiniz.

Kaynak koda bakarsanız , neredeyse 50 satırlık kod (herhangi bir kazan plakası kodu hariç).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.