عند تنفيذ السيناريو البرمجي في Bash
التالي، أتوقع أن يتم طباعة Hello
. بدلاً من ذلك، يقوم بطباعة سطر فارغ وينهي التنفيذ.
echo 'Hello' | echo
لكن لماذا لا يعمل التوجيه
لإخراج echo
إلى echo
؟ هذا سؤال يثير الفضول ويتطلب فهمًا عميقًا لكيفية عمل pipes
في نظام التشغيل Unix
.
-
اختيار مكتبة خيوط C متعددة المنصات02/02/2024
-
تفحص شامل لأنظمة التشغيل الحديثة وتطوراتها09/01/2024
-
تنسيق الطباعة في UNIX وفهم ملفات .tar15/02/2024
أساساً، عندما تستخدم |
لتوجيه إخراج أمر إلى آخر، يتم نقل البيانات من الإخراج القياسي للأمر الأول (echo 'Hello'
في هذه الحالة) إلى الإدخال القياسي للأمر الثاني (echo
هنا).
في هذا السياق، لا يتوقع الأمر الثاني (echo
) أي إدخال، لذا ينتهي فورًا دون طباعة أي شيء. الأمر الأول ينفذ بشكل صحيح ويقوم بإرسال Hello
إلى الأمر الثاني، ولكن الأمر الثاني لا يقوم بشيء بسبب عدم وجود إدخال متوقع.
لتحقيق النتيجة المتوقعة، يمكنك استخدام cat
كأمر ثانوي لاستقبال الإدخال وإعادة إرساله كإدخال للأمر الثاني. فيما يلي سيناريو يعمل كما هو متوقع:
echo 'Hello' | cat | echo
بهذه الطريقة، يتم نقل Hello
من الأمر الأول إلى الأمر الثاني عبر cat
، ويتم طباعته بنجاح.
باختصار، عدم عمل السيناريو الأصلي يعود إلى عدم وجود إدخال متوقع للأمر الثاني الذي يأتي بعد الأنبوبة.
المزيد من المعلومات
لفهم المزيد حول هذا السيناريو ولماذا لا يعمل كما هو متوقع، يجب أن نلقي نظرة أعمق على كيفية عمل نظام التشغيل Unix
فيما يتعلق بالأنابيب (pipes
).
في السيناريو الأصلي:
echo 'Hello' | echo
عندما يتم تنفيذ هذا السيناريو، يتم إنشاء subshell
لكل أمر يأتي بعد الأنبوبة (|
). في هذه الحالة، يكون الأمر الأول echo 'Hello'
والأمر الثاني echo
.
المشكلة هي أنه حتى لو تم توجيه إخراج الأمر الأول (echo 'Hello'
) إلى الأمر الثاني (echo
)، إلا أن الـsubshell
الذي يتم إنشاؤه للأمر الثاني ينتهي قبل أن يتم طباعة أي شيء. يعني ذلك أنه حتى لو تم نقل الإخراج بنجاح، لا يكون هناك وقت كاف لطباعة الناتج قبل انتهاء الـsubshell
.
للتغلب على هذا التحدي، يمكن استخدام أمر مثل cat
كوسيط للحفاظ على وجود الـsubshell
الذي يأتي بعد الأنبوبة:
echo 'Hello' | cat | echo
بهذه الطريقة، يتم إنشاء subshell
لـcat
، ويكون لديه وقت كافٍ لطباعة الإخراج الذي تم توجيهه من الأمر الأول.
في الختام، فإن فهم عميق لكيفية تنفيذ الأوامر والـsubshells
في نظام التشغيل Unix
يساعد في توضيح سبب عدم عمل السيناريو الأصلي كما هو متوقع وكيفية التعامل مع هذا النوع من المشاكل.