إنشاء خطوط أنابيب القراءة من الأنابيب اسمه دون عرقلة في باش

StackOverflow https://stackoverflow.com/questions/179291

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا أبحث لاستدعاء فرعي أو جانبي مع واصف ملف فتح لأنبوب معين مثل أن الدعوة مفتوحة () لا تعليق انتظار الجانب الآخر من الأنبوب لتلقي اتصال.

لإظهار:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5</tmp/foobar.pipe

في هذه الحالة، لا يتم تشغيل some_program حتى لديه بعض عملية /tmp/foobar.pipe فتح للكتابة. ومع ذلك، some_program له تأثيرات مفيدة حتى عندما لا يتلقى الأوامر، هو السلوك المطلوب وذلك لsome_program ليتم تنفيذها على الفور.

وآليات القيام بذلك عن طريق exec'ing من خلال لغة البرمجة البديل (بيثون، بيرل، إلخ) أو المجمع C التي /tmp/foobar.pipe مفتوحة مع العلم O_NONBLOCK واضحة. أنا أبحث عن حل نقية باش، ينبغي للمرء أن يكون ممكنا.

هل كانت مفيدة؟

المحلول

وفتح FD قراءة / كتابة بدلا من قراءة فقط عند إعداد يمنع خط أنابيب الحجب.

ليكون أكثر قليلا محددة:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5<>/tmp/foobar.pipe

ويمنع السلوك حجب غير المرغوب فيه، ويفتح 5<>/tmp/foobar.pipe في وضع RW (في مقابل فتح في وضع القراءة فقط كما هو الحال مع 5</tmp/foobar.pipe) على الرغم من لا يزال يتم تعيين O_NONBLOCK. بفضل فالدنر على IRC: //irc.freenode.org/#bash لهذا المؤشر

نصائح أخرى

والطريقة الوحيدة وأنا أعلم الحصول على هذا النوع من النتيجة هي الإختراق:

mkfifo /tmp/foobar.in
mkfifo /tmp/foobar.out
( cat </tmp/foobar.in ) >/tmp/foobar.out &
some_program --command-fd=5 5</tmp/foobar.out

وربما هذا يساعد على: -)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top