إنشاء خطوط أنابيب القراءة من الأنابيب اسمه دون عرقلة في باش
سؤال
وأنا أبحث لاستدعاء فرعي أو جانبي مع واصف ملف فتح لأنبوب معين مثل أن الدعوة مفتوحة () لا تعليق انتظار الجانب الآخر من الأنبوب لتلقي اتصال.
لإظهار:
$ 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
وربما هذا يساعد على: -)