สร้างไฟล์เสมือนจริงที่เป็นคำสั่ง


18

มีวิธีการสร้างไฟล์เสมือนเช่นอ่านจากไฟล์จริงอ่านจากstdoutคำสั่งของ; การเขียนไปยังไฟล์เป็นการเขียนไปยังstdinคำสั่งหรือไม่

จนถึงตอนนี้ฉันได้ตัดมันด้วยinotifywaitไฟล์บนซึ่งเรียกคำสั่งเมื่อไฟล์ถูกแก้ไขโดยนำข้อมูลจากไฟล์และเขียนกลับไป

ฉันไม่ชอบที่inotifywaitจะต้องเริ่มต้นใหม่อย่างต่อเนื่องแม้ว่า (และฉันต้องให้แน่ใจว่ามันจะทำงานอยู่เสมอ) ฉันใช้ไฟล์นี้แค่สองครั้งต่อสัปดาห์

คำตอบ:


17

คุณอาจจะมองหาไปป์ที่มีชื่อ

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

การเขียนไปยังไพพ์ไม่ได้เริ่มโปรแกรมการฟัง หากคุณต้องการประมวลผลอินพุตในลูปคุณต้องเปิดโปรแกรมการฟังต่อไป

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

โปรดทราบว่าข้อมูลทั้งหมดที่เขียนไปยังไพพ์นั้นถูกรวมเข้าด้วยกันแม้ว่าจะมีหลายกระบวนการเขียนก็ตาม หากกระบวนการหลายอันกำลังอ่านข้อมูลเพียงอันเดียวจะได้รับข้อมูล ดังนั้นท่ออาจไม่เหมาะกับสถานการณ์ที่เกิดขึ้นพร้อมกัน

ซ็อกเก็ตที่ระบุชื่อสามารถจัดการการเชื่อมต่อพร้อมกันได้ แต่เกินความสามารถของเชลล์สคริปต์พื้นฐาน

ในตอนท้ายที่ซับซ้อนมากที่สุดของขนาดที่มีระบบไฟล์ที่กำหนดเองซึ่งช่วยให้คุณออกแบบและติดตั้งระบบแฟ้มที่แต่ละopen, writeฯลฯ เรียกฟังก์ชั่นในโปรแกรม เงินลงทุนขั้นต่ำเป็นหลายสิบเส้นของการเข้ารหัสขี้ปะติ๋วเช่นในหลาม ถ้าคุณเพียงต้องการที่จะรันคำสั่งเมื่อมีการอ่านไฟล์คุณสามารถใช้scriptfsหรือfuseflt


3

บางสิ่งที่ต้องระวังเกี่ยวกับไพพ์ที่มีชื่อ: ไพพ์ไม่เหมือนไฟล์มีผู้อ่านหลายคน เมื่ออ่านเนื้อหาแล้วมันจะหายไป ดังนั้นคุณต้องวนซ้ำนั่นคือคุณจะต้องดันเนื้อหาลงในท่อจากผู้เขียน

ฉันได้รับการค้นหาคำตอบกับตัวเองคำถามนี้และสิ่งเดียวที่อื่น ๆ ที่ฉันได้รับสามารถที่จะเกิดขึ้นกับเป็นscriptfsซึ่งอยู่บนพื้นฐานฟิวส์


1

สิ่งที่คุณอธิบายเป็นหลักไฟล์ FIFO fifo(7)พิเศษดู พวกเขาถูกสร้างขึ้นโดยmkfifo(1)และกระบวนการสามารถเปิดได้ภายใต้ Linux สำหรับ R / W (ไม่ใช่ระบบ Unixy ทั้งหมดที่จัดการนั้น) สองกระบวนการอิสระจากนั้นสามารถใช้เพื่อสื่อสาร


0

วิธีที่ง่ายที่สุดในการ "สร้างไฟล์เสมือนที่เป็นจริงคำสั่ง" คือการขยายระบบไฟล์ FUSE มันง่ายมากที่จะทำกับไลบรารี่เช่น fusepy

นี่คือตัวอย่างของระบบไฟล์ FUSE ที่ให้คุณอ่านไฟล์ HTTP / HTTPS / FTP ราวกับว่าไฟล์นั้นมีอยู่ในกล่อง Linux ของคุณเอง คุณสามารถสร้างสิ่งที่รันคำสั่งใด ๆ ในทำนองเดียวกันเมื่ออ่าน

ถ้าคุณดูซอร์สโค้ดมันเป็นโค้ดที่ไม่ค่อยมี 50 บรรทัด (ไม่รวมรหัสสำเร็จรูป)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.