خط الأنابيب (يونكس)

في أنظمة التشغيل الحاسوبية الشبيهة بنظام يونكس ، تُعدّ سلسلة العمليات آليةً للتواصل بين العمليات باستخدام تمرير الرسائل . تتكون سلسلة العمليات من مجموعة من العمليات المتصلة ببعضها عبر تدفقاتها القياسية ، بحيث يُمرَّر نص الإخراج لكل عملية ( stdout ) مباشرةً كمدخل ( stdin ) للعملية التالية. تبدأ العملية الثانية بينما لا تزال العملية الأولى قيد التنفيذ، ويتم تنفيذهما بالتزامن .
دافع دوغلاس ماكلروي عن مفهوم خطوط الأنابيب في مختبرات بيل ، الموطن الأصلي لنظام يونكس ، خلال تطويره، مُشكلاً بذلك فلسفة أدواته . وقد سُميت بهذا الاسم تشبيهاً بخط الأنابيب المادي . ومن أبرز سمات هذه الخطوط "إخفاء التفاصيل الداخلية"، مما يُتيح بدوره مزيداً من الوضوح والبساطة في النظام.
الأنابيب في خط الأنابيب هي أنابيب مجهولة (على عكس الأنابيب المسماة )، حيث يقوم نظام التشغيل بتخزين البيانات التي يكتبها أحد العمليات مؤقتًا حتى يقرأها العملية التالية، وتختفي هذه القناة أحادية الاتجاه عند اكتمال العمليات. الصيغة القياسية للأنابيب المجهولة في سطر الأوامر هي سرد عدة أوامر مفصولة بخطوط عمودية (" أنابيب " كما هو شائع في مصطلحات يونكس).
تاريخ
ابتكر دوغلاس ماكلروي مفهوم خطوط المعالجة [ 1 ] ، ووُصف لأول مرة في صفحات دليل المستخدم لنظام يونكس الإصدار 3. [ 2 ] [ 3 ] لاحظ ماكلروي أن معظم واجهات سطر الأوامر كانت تُمرر ملف الإخراج من برنامج ما كمدخل لبرنامج آخر. وقد دافع دوغلاس ماكلروي عن مفهوم خطوط المعالجة في مختبرات بيل ، الموطن الأصلي لنظام يونكس ، خلال تطويره، مما ساهم في تشكيل فلسفة أدواته . [ 4 ] [ 5 ]
طُبقت أفكاره عام ١٩٧٣ عندما أضاف كين تومسونpipe() (في ليلة واحدة حافلة بالنشاط، كما كتب ماكلروي) استدعاء النظام والأنابيب إلى الصدفة والعديد من الأدوات المساعدة في الإصدار الثالث من يونكس. وتابع ماكلروي: "في اليوم التالي، شهدنا موجة لا تُنسى من التعليقات الساخرة، حيث انضم الجميع إلى حماسة استخدام الأنابيب". كما يُنسب الفضل إلى تومسون في |وضع الترميز الذي بسّط بشكل كبير وصف بنية الأنابيب في الإصدار الرابع . [ ٦ ] [ ٢ ]
على الرغم من تطويرها بشكل مستقل، فإن أنابيب يونكس مرتبطة بملفات الاتصال التي طورها كين لوكنر [ 7 ] في الستينيات لنظام دارتموث لتقاسم الوقت ، وقد سبقتها [ 8 ] .
أنظمة تشغيل أخرى
تم استعارة هذه الميزة من نظام يونكس بواسطة أنظمة تشغيل أخرى، مثل MS-DOS وحزمة CMS Pipelines على VM/CMS و MVS ، وفي النهاية تم تسميتها بنمط تصميم الأنابيب والمرشحات لهندسة البرمجيات .
تطوير المفهوم بشكل أكبر
في عمليات الاتصال التسلسلي (CSP) لتوني هوار ، تم تطوير أنابيب ماكلروي بشكل أكبر. [ 9 ]
تطبيق
تُستخدم آلية خط الأنابيب للتواصل بين العمليات باستخدام تمرير الرسائل. خط الأنابيب عبارة عن مجموعة من العمليات المتصلة ببعضها عبر تدفقاتها القياسية ، بحيث يُمرر نص الإخراج لكل عملية ( stdout ) مباشرةً كمدخل ( stdin ) للعملية التالية. تبدأ العملية الثانية بينما لا تزال العملية الأولى قيد التنفيذ، ويتم تنفيذهما بالتزامن . سُميت بهذا الاسم تشبيهًا بخط الأنابيب المادي . من السمات الرئيسية لهذه الخطوط "إخفاء التفاصيل الداخلية". [ 10 ] وهذا بدوره يُتيح مزيدًا من الوضوح والبساطة في النظام.
في معظم الأنظمة الشبيهة بنظام يونكس، تبدأ جميع عمليات خط الأنابيب في الوقت نفسه، مع ربط تدفقاتها بشكل مناسب ، ويتولى المجدول إدارتها مع جميع العمليات الأخرى الجارية على الجهاز. ومن أهم ما يميز أنابيب يونكس عن غيرها من تطبيقات الأنابيب، مفهوم التخزين المؤقت : فعلى سبيل المثال، قد ينتج برنامج إرسال 5000 بايت في الثانية ، بينما قد لا يتمكن برنامج استقبال إلا من استقبال 100 بايت في الثانية، ولكن لا تُفقد أي بيانات. بدلاً من ذلك، يُحفظ ناتج برنامج الإرسال في المخزن المؤقت. عندما يكون برنامج الاستقبال جاهزًا لقراءة البيانات، يقرأ البرنامج التالي في خط الأنابيب من المخزن المؤقت. إذا امتلأ المخزن المؤقت، يتوقف برنامج الإرسال (يُحظر) حتى يقوم برنامج الاستقبال بإزالة بعض البيانات منه. في نظام لينكس، يبلغ حجم المخزن المؤقت 16 صفحة ، أي ما يعادل 65536 بايت (64 كيلوبايت) في معظم الأنظمة. [ 11 ]
أنابيب الشبكة
يمكن لأدوات مثل netcat و socat توصيل الأنابيب بمنافذ TCP/ IP .
خطوط الأنابيب في واجهات سطر الأوامر
تحتوي جميع واجهات يونكس الشائعة الاستخدام على بنية نحوية خاصة لإنشاء خطوط الأنابيب. في جميع الحالات، تُكتب الأوامر بالتسلسل، مفصولة برمز الخط العمودي ASCII (والذي يُطلق عليه غالبًا "رمز الأنبوب"). تبدأ الواجهة العمليات وتُهيئ الاتصالات اللازمة بين تدفقاتها القياسية (بما في ذلك مساحة تخزين مؤقتة ).|
تستخدم هذه الآلية أنابيب مجهولة . في الأنابيب المجهولة، يقوم نظام التشغيل بتخزين البيانات التي يكتبها أحد العمليات مؤقتًا حتى يقرأها العملية التالية، وتختفي هذه القناة أحادية الاتجاه عند اكتمال العمليات؛ وهذا يختلف عن الأنابيب المسماة ، حيث تُمرر الرسائل من وإلى أنبوب مُسمى عن طريق جعله ملفًا، ويبقى هذا الأنبوب بعد اكتمال العمليات. الصيغة القياسية للأنابيب المجهولة في سطر الأوامر هي سرد عدة أوامر، مفصولة بخطوط عمودية ("أنابيب" في مصطلحات يونكس الشائعة).
الأمر 1 | الأمر 2 | الأمر 3 على سبيل المثال، لعرض قائمة الملفات في الدليل الحالي ( ls )، والاحتفاظ فقط بأسطر مخرجات ls التي تحتوي على السلسلة "key" ( grep )، وعرض النتيجة في صفحة قابلة للتمرير ( less )، يقوم المستخدم بكتابة ما يلي في سطر أوامر الطرفية:
ls -l | grep key | less يُنفَّذ الأمر ls -lكعملية، حيث تُمرَّر مخرجاتها (stdout) إلى مدخلات (stdin) العملية السابقة grep key؛ وبالمثل بالنسبة للعملية اللاحقة less. تأخذ كل عملية مدخلات من العملية السابقة وتُنتج مخرجات للعملية التالية عبر تدفقات قياسية . |يُخبر كل أمر الصدفة بتوصيل المخرجات القياسية للأمر على اليسار بالمدخلات القياسية للأمر على اليمين بواسطة آلية اتصال بين العمليات تُسمى أنبوبًا (مجهولًا) ، مُطبَّقة في نظام التشغيل. الأنابيب أحادية الاتجاه؛ حيث تتدفق البيانات عبرها من اليسار إلى اليمين.
مثال
فيما يلي مثال على مسار معالجة يُنفذ نوعًا من مدقق الإملاء لمورد الويب المشار إليه بواسطة عنوان URL . يلي ذلك شرح لما يفعله.
curl 'https://en.wikipedia.org/wiki/Pipeline_(Unix)' |sed 's/[^a-zA-Z ]/ /g' |tr 'AZ ' 'az\n' |grep '[az]' |sort -u |comm -23 - < ( sort /usr/share/dict/words ) |أقل curlيحصل على محتويات HTML لصفحة ويب (يمكن استخدامهwgetعلى بعض الأنظمة).sedيستبدل جميع الأحرف (من محتوى صفحة الويب) التي ليست مسافات أو حروفًا بمسافات. ( يتم الحفاظ على أسطر جديدة .)trيقوم بتحويل جميع الأحرف الكبيرة إلى أحرف صغيرة ويحول المسافات في سطور النص إلى أسطر جديدة (كل كلمة الآن على سطر منفصل).grepيتضمن فقط الأسطر التي تحتوي على حرف أبجدي صغير واحد على الأقل (مع إزالة أي أسطر فارغة).sortيقوم بترتيب قائمة "الكلمات" أبجديًا، ويقوم-uالمفتاح بإزالة التكرارات.commيُحدد هذا الأمر الأسطر المشتركة بين ملفين،-23ويحذف الأسطر الخاصة بالملف الثاني، والأسطر المشتركة بينهما، تاركًا فقط تلك الموجودة في الملف الأول المُسمى.-يؤدي استبدال اسم الملفcommإلى استخدام مُدخلاته القياسية (من سطر الأوامر في هذه الحالة).sort /usr/share/dict/wordsيُرتب محتويات الملفwordsأبجديًا، كماcommهو متوقع،<( ... )ويُخرج النتائج إلى ملف مؤقت (عبر استبدال العملية )، والذيcommيقرأه. والنتيجة هي قائمة بالكلمات (الأسطر) غير الموجودة في /usr/share/dict/words.lessيسمح للمستخدم بتصفح النتائج صفحةً صفحة.
تدفق الخطأ
افتراضيًا، لا تُمرَّر تدفقات الخطأ القياسي (" stderr ") للعمليات في مسار المعالجة عبر الأنبوب؛ بل تُدمج وتُوجَّه إلى وحدة التحكم . مع ذلك، تحتوي العديد من الصدفات على صيغة إضافية لتغيير هذا السلوك. في صدفة csh ، على سبيل المثال، استخدام `stderr` |&بدلًا من ` |stderr` يعني أنه يجب دمج تدفق الخطأ القياسي مع المخرجات القياسية وتغذيته إلى العملية التالية. يمكن لصدفة Bash أيضًا دمج الخطأ القياسي مع `stderr` |&منذ الإصدار 4.0 [ 12 ] أو باستخدام 2>&1`stderr`، بالإضافة إلى إعادة توجيهه إلى ملف مختلف.
مطحنة الأنابيب
في أبسط خطوط المعالجة وأكثرها شيوعًا، يربط النظام سلسلة من العمليات الفرعية عبر الأنابيب، وينفذ أوامر خارجية داخل كل عملية فرعية. وبالتالي، لا يقوم النظام نفسه بمعالجة البيانات المتدفقة عبر خط المعالجة بشكل مباشر.
مع ذلك، من الممكن أن يقوم النظام بمعالجة البيانات مباشرةً، باستخدام ما يُسمى بـ " الطحن " أو "طحن الأنابيب " (حيث whileيُستخدم أمرٌ ما "لطحن" نتائج الأمر الأولي). ويكون هذا التركيب عادةً على النحو التالي:
أمر | بينما اقرأ -r var1 var2 ... ؛ نفّذ # معالجة كل سطر، باستخدام المتغيرات كما تم تحليلها إلى var1، var2، إلخ # (لاحظ أن هذا قد يكون غلافًا فرعيًا: لن تكون var1، var2، إلخ متاحة # بعد انتهاء حلقة while؛ بعض الأغلفة، مثل zsh والإصدارات الأحدث # من Korn shell، تعالج الأوامر الموجودة على يسار عامل الأنبوب # في غلاف فرعي) انتهىقد لا تعمل هذه الحلقة البرمجية كما هو مُخطط لها إذا احتوى جسم الحلقة على أوامر، مثل ` catand` ssh، التي تقرأ من stdin`: [ 13 ]`. في التكرار الأول للحلقة، سيقرأ هذا البرنامج (لنُسمِّه المُصرِّفcommand ) المُخرَج المتبقي من `:`، ثم ستنتهي الحلقة (وتعتمد النتائج على خصائص المُصرِّف). هناك طريقتان مُمكنتان لتجنُّب هذا السلوك. أولًا، تدعم بعض المُصرِّفات خيارًا لتعطيل القراءة من `:` stdin(مثل `: ssh -n`). ثانيًا، إذا لم يكن المُصرِّف بحاجة إلى قراءة أي مُدخلات من `:` stdinللقيام بشيء مُفيد، فيُمكن تمريرها < /dev/nullكمُدخل.
بما أن جميع مكونات الأنبوب تُشغَّل بالتوازي، فإن الصدفة عادةً ما تُنشئ عملية فرعية (صدفة فرعية) لمعالجة محتوياته، مما يجعل من المستحيل نقل تغييرات المتغيرات إلى بيئة الصدفة الخارجية. ولحل هذه المشكلة، يمكن تغذية "مطحنة الأنابيب" من مستند مضمَّن يحتوي على استبدال أمر ، والذي ينتظر انتهاء تشغيل خط الأنابيب قبل معالجة محتوياته. بدلاً من ذلك، يمكن استخدام أنبوب مُسمّى أو استبدال عملية للتنفيذ المتوازي. كما يوفر GNU bashlastpipe خيارًا لتعطيل إنشاء العملية الفرعية لمكون الأنبوب الأخير. [ 14 ]
إنشاء خطوط الأنابيب برمجياً
يمكن إنشاء مسارات البيانات تحت سيطرة البرنامج. يستدعي pipe()نظام يونكس هذا الأمر لإنشاء كائن مسار بيانات مجهول جديد . ينتج عن ذلك مُعرّفان جديدان للملفات مفتوحان: طرف للقراءة فقط، وطرف للكتابة فقط. يبدو طرفا المسار كمُعرّفين عاديين للملفات المجهولة ، باستثناء أنهما لا يملكان خاصية البحث.
لتجنب حالة الجمود واستغلال التوازي، تقوم عملية يونكس التي تحتوي على أنبوب واحد أو أكثر، عادةً، باستدعاء وظيفة fork()لإنشاء عمليات جديدة. ثم تقوم كل عملية بإغلاق طرف (أو أطراف) الأنبوب الذي لن تستخدمه قبل إنتاج أو استهلاك أي بيانات. بدلاً من ذلك، قد تقوم عملية بإنشاء سلاسل عمليات جديدة واستخدام الأنبوب للتواصل فيما بينها.
يمكن أيضًا إنشاء الأنابيب المسماةmkfifo() باستخدام أوmknod()ثم تقديمها كملف إدخال أو إخراج للبرامج عند استدعائها. تسمح هذه الأنابيب بإنشاء مسارات متعددة، وتكون فعالة بشكل خاص عند دمجها مع إعادة توجيه الأخطاء القياسية، أو معtee.
الثقافة الشعبية
حتى نظام التشغيل MacOS Tahoe ، كان الروبوت الموجود في أيقونة برنامج Automator من Apple ، والذي يستخدم أيضًا مفهوم خط الأنابيب لربط الأوامر المتكررة معًا، يحمل أنبوبًا تكريمًا لمفهوم Unix الأصلي.
بلغات أخرى
يمكن استخدام خطوط الأنابيب في لغة C++ . تُقدّم C++20operator| عامل الربط (piping operator) وتسمح بعمليات الربط المتسلسلة على غرار LINQ مع std::rangesمساحات الأسماء. std::viewsتحتوي على عدة فئات يتم استدعاؤها من خلال operator(). [ 15 ]
باستخدام std :: vector ؛ باستخدام std :: ranges :: to ؛ باستخدام std :: views :: filter ؛ باستخدام std :: views :: transform ؛vector < int > numbers = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };// مسار المعالجة: تصفية الأعداد الزوجية، ومضاعفتها، ثم جمع متجه النتيجة < int > result = numbers | filter ( []( int n ) -> bool { return n % 2 == 0 ; }) | transform ([]( int n ) -> int { return n * 2 ; }) | to < vector > ();انظر أيضاً
- كل شيء عبارة عن ملف – يصف هذا أحد السمات المميزة لنظام يونكس؛ حيث تعمل خطوط المعالجة على "ملفات" بالمعنى المتعارف عليه في يونكس.
- الأنبوب المجهول – بنية FIFO تُستخدم للاتصال بين العمليات
- جي ستريمر – إطار عمل للوسائط المتعددة قائم على خطوط الأنابيب
- خطوط أنابيب CMS
- المكرر
- الاستعلام المتكامل للغة (LINQ)
- تسلسل الأساليب
- الأنابيب المسماة – أنابيب مستمرة تُستخدم للاتصال بين العمليات
- استبدال العمليات - صيغة سطر الأوامر لربط عدة أنابيب بعملية واحدة
- برنامج GNU Parallel
- خطوط المعالجة (الحوسبة) – خطوط المعالجة الأخرى المتعلقة بالحاسوب
- إعادة التوجيه (الحوسبة)
- الأمر Tee (command) – أمر عام لاستخراج البيانات من مسار البيانات
- مسار XML – لمعالجة ملفات XML
- xargs
مراجع
- ↑ "إنشاء نظام التشغيل يونكس" . مختبرات بيل. مؤرشف من الأصل في 14 سبتمبر 2004.
- 1 2 ماكيلروي، دكتور في الطب (1987). قارئ أبحاث يونكس: مقتطفات مشروحة من دليل المبرمج، 1971-1986 (ملف PDF) (تقرير فني). مختبرات بيل. 139.
- ↑ تومسون ك ، ريتشي د.م. (فبراير 1973). دليل مبرمج يونكس، الطبعة الثالثة (ملف PDF) (تقرير فني) ( الطبعة الثالثة). مختبرات بيل. ص 178.
- ↑ ماهوني، مايكل س. "مشروع التاريخ الشفوي لنظام يونكس: الإصدار 0، البداية" .
ماكلروي: كان هذا أحد الأماكن القليلة التي كدتُ فيها أن أمارس سيطرة إدارية على نظام يونكس، وكنتُ أدفع باتجاه هذه الأمور، نعم.
- ↑ "النقوش الصخرية النبوئية" . www.bell-labs.com . مؤرشف من الأصل في 8 مايو 1999. تم الاطلاع عليه في 22 مايو 2022 .
- ↑ "الأنابيب: مقدمة موجزة" . مشروع معلومات لينكس. 23 أغسطس 2006 [تاريخ الإنشاء: 29 أبريل 2004] . تاريخ الاسترجاع: 7 يناير 2024 .
- ↑ "نظام المشاركة الزمنية في دارتموث" (ملف DOC) . معهد روتشستر للتكنولوجيا . تم الاطلاع عليه في 7 يناير 2024 .
- ↑ "البيانات" . www.bell-labs.com . مؤرشف من الأصل في 20 فبراير 1999. تم الاطلاع عليه في 22 مايو 2022 .
- ↑ كوكس، روس. "مختبرات بيل وخيوط CSP" . سويتشبورد . تم الاسترجاع في 7 يناير 2024 .
- ↑ ريتشي وتومسون، 1974
- ↑ – دليل مبرمج لينكس – نظرة عامة، واصطلاحات، ومعلومات متنوعة من موقع Manned.org
- ↑ "ملاحظات إصدار Bash" . tiswww.case.edu . تم الاطلاع عليه بتاريخ 14-06-2017 .
- ↑ "التفاعل الحلقي مع SSH" . 6 مارس 2012. مؤرشف من الأصل في 6 مارس 2012.
- ↑ John1024. "كيف يمكنني تخزين نتائج أمر "find" كمصفوفة في Bash؟" . Stack Overflow .
{{cite web}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط ) - ↑ "مكتبة النطاقات (منذ C++20) - cppreference.com" . cppreference.com . تم الاطلاع عليه بتاريخ 4 سبتمبر 2025 .
- سال سوغويان يتحدث عن الحلقة الثالثة من برنامج ماك بريك بعنوان "ادخل إلى الأوتوماتريكس"
روابط خارجية
- تاريخ تدوين الأنابيب في يونكس ( مؤرشف بتاريخ 8 أبريل 2015 في أرشيف الإنترنت )
- مذكرة دوغ ماكلروي الأصلية لعام 1964 ، التي اقترحت مفهوم الأنبوب لأول مرة
- إنشاء قناة بين العمليات - مرجع واجهات النظام، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- الأنابيب: مقدمة موجزة من مشروع معلومات لينكس (LINFO)
- أنابيب يونكس – نموذج برمجة قوي وأنيق (سوفت بانوراما)
- تحليل البيانات المخصص من سطر أوامر يونكس في ويكي بوكس - يوضح كيفية استخدام خطوط الأنابيب المكونة من مرشحات بسيطة لإجراء تحليل بيانات معقد.
- استخدام وإساءة استخدام الأنابيب مع بيانات الصوت - يقدم مقدمة عن استخدام وإساءة استخدام الأنابيب مع netcat و nettee و fifos لتشغيل الصوت عبر الشبكة.
- stackoverflow.com – أسئلة وأجوبة حول التعامل مع خطوط أنابيب باش.
- التواصل بين العمليات
- يونكس
