ما المقصود بـ stdin و stdout و stderr على Linux؟
فاطماواتي أحمد زينوري / Shutterstock.com
stdin
و stdout
و stderr
هي ثلاثة تدفقات بيانات تم إنشاؤها عند تشغيل أمر Linux. يمكنك استخدامها لمعرفة ما إذا كان يتم توجيه البرامج النصية الخاصة بك أو إعادة توجيهها. نوضح لك كيف.
تيارات الانضمام إلى نقطتين
بمجرد أن تبدأ في التعرف على أنظمة التشغيل Linux وأنظمة التشغيل الشبيهة بـ Unix ، ستصادف المصطلحات stdin
، stdout
، و stederr
. هؤلاء هم ثلاثة تيارات قياسية التي يتم إنشاؤها عند تنفيذ أمر Linux. في الحوسبة ، الدفق هو شيء يمكنه نقل البيانات. في حالة هذه التدفقات ، تكون هذه البيانات نصية.
تيارات البيانات ، مثل تيارات المياه ، لها طرفان. لديهم مصدر وتدفق خارجي. أيًا كان أمر Linux الذي تستخدمه يوفر طرفًا واحدًا لكل بث. يتم تحديد الطرف الآخر بواسطة القشرة التي أطلقت الأمر. سيتم توصيل هذه النهاية بالنافذة الطرفية ، أو توصيلها بأنبوب ، أو إعادة توجيهها إلى ملف أو أمر آخر ، وفقًا لسطر الأوامر الذي أطلق الأمر.
تدفقات لينكس القياسية
في Linux ، stdin
هو تيار الإدخال القياسي. هذا يقبل النص كمدخلاته. يتم تسليم إخراج النص من الأمر إلى الغلاف عبر stdout
(قياسي خارج) تيار. يتم إرسال رسائل الخطأ من الأمر من خلال stderr
(خطأ قياسي) دفق.
لذا يمكنك أن ترى أن هناك دفقان إخراج ، stdout
و stderr
، وتدفق إدخال واحد ، stdin
. نظرًا لأن كل من رسائل الخطأ والمخرجات العادية لها قناة خاصة بها لنقلها إلى النافذة الطرفية ، فيمكن التعامل معها بشكل مستقل عن بعضها البعض.
يتم التعامل مع التدفقات مثل الملفات
يتم التعامل مع التدفقات في Linux - مثل أي شيء آخر تقريبًا - كما لو كانت ملفات. يمكنك قراءة نص من ملف ، ويمكنك كتابة نص في ملف. يتضمن كلا الإجراءين دفقًا من البيانات. لذا فإن مفهوم التعامل مع تدفق البيانات كملف ليس بهذا القدر من الامتداد.
الإعلاناتيتم تخصيص رقم فريد لكل ملف مرتبط بعملية ما للتعرف عليه. يُعرف هذا باسم واصف الملف. عندما يتطلب الأمر تنفيذ إجراء على ملف ، واصف الملف يستخدم لتعريف الملف.
تُستخدم هذه القيم دائمًا لـ stdin
، stdout,
و stderr
:
- 0 : stdin
- واحد : stdout
- اثنين : ستدير
الرد على الأنابيب وعمليات إعادة التوجيه
لتسهيل مقدمة شخص ما إلى موضوع ما ، من الأساليب الشائعة تعليم نسخة مبسطة من الموضوع. على سبيل المثال ، في القواعد ، يُخبرنا أن القاعدة هي I قبل E ، باستثناء ما بعد C. ولكن في الواقع ، هناك هي استثناءات أكثر لهذه القاعدة من الحالات التي تطيعها.
على نفس المنوال ، عند الحديث عن stdin
و stdout
و stderr
من الملائم توضيح البديهية المقبولة بأن العملية لا تعرف ولا تهتم بمكان إنهاء تدفقاتها القياسية الثلاثة. هل يجب أن تهتم العملية بما إذا كان إخراجها سينتقل إلى الجهاز أو يتم إعادة توجيهه إلى ملف؟ هل يمكنه حتى معرفة ما إذا كان الإدخال يأتي من لوحة المفاتيح أم أنه يتم إدخاله عبر الأنابيب من عملية أخرى؟
في الواقع ، هناك عملية تعرف - أو على الأقل يمكنها اكتشاف ذلك ، إذا اختارت التحقق - ويمكنها تغيير سلوكها وفقًا لذلك إذا قرر مؤلف البرنامج إضافة هذه الوظيفة.
الإعلاناتيمكننا أن نرى هذا التغيير في السلوك بسهولة بالغة. جرب هذين الأمرين:
ls
stdout
ال ls
يتصرف الأمر بشكل مختلف إذا تم توجيه مخرجاته (cat
) إلى أمر آخر. إنه ls
الذي يتحول إلى ناتج عمود واحد ، فهو ليس تحويلاً يتم إجراؤه بواسطة stdout
. و stderr
يفعل الشيء نفسه إذا تمت إعادة توجيه مخرجاته:
stdout
stdout
إعادة توجيه stdout و stderr
هناك ميزة أن يتم تسليم رسائل الخطأ من خلال دفق مخصص. هذا يعني أنه يمكننا إعادة توجيه إخراج الأمر (stderr
) إلى ملف وما زلنا نرى أي رسائل خطأ (stdout
) في نافذة المحطة الطرفية. يمكنك الرد على الأخطاء إذا احتجت إلى ذلك ، عند حدوثها. كما أنه يمنع رسائل الخطأ من تلويث الملف الذي stderr
تمت إعادة توجيهه إلى.
اكتب النص التالي في محرر واحفظه في ملف يسمى error.sh.
stderr
اجعل البرنامج النصي قابلاً للتنفيذ باستخدام هذا الأمر:
stdout
يردد السطر الأول من البرنامج النصي النص إلى النافذة الطرفية ، عبر stdin
تدفق. يحاول السطر الثاني الوصول إلى ملف غير موجود. سيؤدي هذا إلى إنشاء رسالة خطأ يتم تسليمها عبر >
.
قم بتشغيل البرنامج النصي باستخدام هذا الأمر:
stdout
يمكننا أن نرى أن كلا دفقَي الإخراج ، stdout
و stderr
في النوافذ الطرفية.
دعنا نحاول إعادة توجيه الإخراج إلى ملف:
2>
الإعلانات
رسالة الخطأ التي تم تسليمها عبر stdout
لا يزال يتم إرسالها إلى نافذة المحطة. يمكننا التحقق من محتويات الملف لمعرفة ما إذا كان echo
ذهب الإخراج إلى الملف.
stderr
الإخراج من stdout
تم إعادة توجيهه إلى الملف كما هو متوقع.
ال stderr
يعمل رمز إعادة التوجيه مع stdout
بشكل افتراضي. يمكنك استخدام أحد واصفات الملفات الرقمية للإشارة إلى تدفق الإخراج القياسي الذي ترغب في إعادة توجيهه.
لإعادة توجيه stderr
بشكل صريح ، استخدم تعليمات إعادة التوجيه هذه:
stdout
لإعادة توجيه stderr
بشكل صريح ، استخدم تعليمات إعادة التوجيه هذه:
stdout
دعونا نحاول إجراء الاختبار مرة أخرى ، وهذه المرة سنستخدم >
:
1>
تمت إعادة توجيه رسالة الخطأ و stderr
stdout
يتم إرسال الرسالة إلى نافذة المحطة:
دعونا نرى ما هو موجود في ملف capture.txt.
stdout
ال stderr
الرسالة في capture.txt كما هو متوقع.
إعادة توجيه كل من stdout و stderr
بالتأكيد ، إذا كان بإمكاننا إعادة توجيه إما /dev/null
أو -t
إلى ملف بشكل مستقل عن الآخر ، يجب أن نكون قادرين على إعادة توجيههما معًا في نفس الوقت ، إلى ملفين مختلفين؟
نعم نستطيع. سيوجه هذا الأمر stdin
إلى ملف يسمى capture.txt و stdin
إلى ملف يسمى error.txt.
stdin
نظرًا لإعادة توجيه كل من تدفقات الإخراج - الإخراج القياسي والخطأ القياسي - إلى الملفات ، فلا يوجد إخراج مرئي في النافذة الطرفية. يتم إرجاعنا إلى موجه سطر الأوامر كما لو لم يحدث شيء.
دعونا نتحقق من محتويات كل ملف:
stdin
stdin
إعادة توجيه stdout و stderr إلى نفس الملف
هذا رائع ، لقد حصلنا على كل تدفقات الإخراج القياسية تنتقل إلى ملفها المخصص. التركيبة الأخرى الوحيدة التي يمكننا القيام بها هي إرسال كلاهما stdout
و cat
إلى نفس الملف.
يمكننا تحقيق ذلك بالأمر التالي:
stdout
دعونا نكسر ذلك.
- ./error.sh : يقوم بتشغيل ملف البرنامج النصي error.sh.
- > Capture.txt : يعيد توجيه
stdout
تيار إلى ملف capture.txt.ls
هو اختصار لـls | cat
. - 2> & 1 : يستخدم هذا الأمر &> تعليمات إعادة التوجيه. تسمح لك هذه التعليمات بإخبار الغلاف بأن يجعل أحد الدفقين قد وصل إلى نفس الوجهة مثل دفق آخر. في هذه الحالة ، نقول إن إعادة توجيه الدفق 2 ،
ls > capture.txt
، إلى نفس الوجهة التي تمت إعادة توجيه البث 1 ،cat capture.txt
إليها.
لا يوجد مخرج مرئي. هذا مشجع.
دعنا نتحقق من ملف capture.txt ونرى ما بداخله.
#!/bin/bash echo 'About to try to access a file that doesn't exist' cat bad-filename.txt
كلاهما
chmod +x error.shو
./error.shتم إعادة توجيه التدفقات إلى ملف وجهة واحد.
لإعادة توجيه إخراج الدفق وإلقائه بصمت ، قم بتوجيه الإخراج إلى
./error.sh > capture.txt.
الكشف عن إعادة التوجيه داخل البرنامج النصي
ناقشنا كيف يمكن للأمر اكتشاف ما إذا كان قد تمت إعادة توجيه أي من التدفقات ، ويمكنه اختيار تغيير سلوكه وفقًا لذلك. هل يمكننا تحقيق ذلك في نصوصنا الخاصة؟ نعم نستطيع. وهي تقنية سهلة الفهم والتوظيف.
الإعلاناتاكتب النص التالي في محرر واحفظه كمدخل.
cat capture.txt
استخدم الأمر التالي لجعله قابلاً للتنفيذ:
1>
الجزء الذكي هو اختبار داخل الأقواس المربعة . ال
2>يعيد الخيار (طرفي) صحيحًا (0) إذا كان الملف المرتبط بواصف الملف ينتهي في نافذة المحطة . لقد استخدمنا واصف الملف 0 كوسيطة للاختبار ، والذي يمثل
./error.sh 2> capture.txt.
إذا كان
cat capture.txtمتصل بنافذة طرفية سيثبت الاختبار صحته. إذا كان
./error.sh 1> capture.txt 2> error.txtمتصل بملف أو أنبوب ، سيفشل الاختبار.
يمكننا استخدام أي ملف نصي مناسب لإنشاء مدخلات إلى البرنامج النصي. نحن هنا نستخدم ملفًا يسمى dummy.txt.
cat capture.txt
يوضح الإخراج أن النص يتعرف على أن الإدخال ليس من لوحة مفاتيح ، بل من ملف. إذا اخترت ذلك ، فيمكنك تغيير سلوك النص وفقًا لذلك.
الإعلانات
كان ذلك من خلال إعادة توجيه الملف ، فلنجربه باستخدام أنبوب.
cat error.txt
يتعرف البرنامج النصي على أن مدخلاته يتم ضخها فيه. أو بتعبير أدق ، يتعرف مرة أخرى على أن
./error.sh > capture.txt 2>&1الدفق غير متصل بنافذة طرفية.
لنقم بتشغيل البرنامج النصي بدون أنابيب أو عمليات إعادة توجيه.
cat capture.txt
ال
#!/bin/bash if [ -t 0 ]; then echo stdin coming from keyboard else echo stdin coming from a pipe or a file fiيتم توصيل الدفق بالنافذة الطرفية ، ويبلغ البرنامج النصي عن ذلك وفقًا لذلك.
للتحقق من نفس الشيء مع تدفق الإخراج ، نحتاج إلى نص برمجي جديد. اكتب ما يلي في محرر واحفظه باسم output.sh.
chmod +x input.sh
استخدم الأمر التالي لجعله قابلاً للتنفيذ:
./input.shالتغيير الوحيد المهم في هذا النص هو في الاختبار بين قوسين معقوفين. نستخدم الرقم 1 لتمثيل واصف الملف لـ
cat dummy.txt | ./input.sh.دعونا نجربها. سنقوم بتوجيه الإخراج من خلال
./input.sh.#!/bin/bash if [ -t 1 ]; then echo stdout is going to the terminal window else echo stdout is being redirected or piped fiالإعلانات
يتعرف البرنامج النصي على أن مخرجاته لن تذهب مباشرة إلى نافذة طرفية.
يمكننا أيضًا اختبار البرنامج النصي عن طريق إعادة توجيه الإخراج إلى ملف.
chmod +x input.sh
لا يوجد إخراج للنافذة الطرفية ، يتم إرجاعنا بصمت إلى موجه الأوامر. كما كنا نتوقع.
يمكننا النظر داخل ملف capture.txt لمعرفة ما تم التقاطه. استخدم الأمر التالي للقيام بذلك.
./output | cat
مرة أخرى ، يكتشف الاختبار البسيط في البرنامج النصي أن
./output.sh > capture.txtلا يتم إرسال الدفق مباشرة إلى نافذة طرفية. الإعلانات
إذا قمنا بتشغيل البرنامج النصي بدون أي أنابيب أو عمليات إعادة توجيه ، فيجب أن يكتشف ذلك
cat capture.shيتم تسليمها مباشرة إلى نافذة المحطة../output.sh
وهذا بالضبط ما نراه.
تيارات الوعي
تتيح لك معرفة كيفية معرفة ما إذا كانت البرامج النصية الخاصة بك متصلة بالنافذة الطرفية ، أو الأنبوب ، أو يتم إعادة توجيهها ، ضبط سلوكها وفقًا لذلك.
يمكن أن تكون مخرجات التسجيل والتشخيص أكثر أو أقل تفصيلاً ، اعتمادًا على ما إذا كان سينتقل إلى الشاشة أو إلى ملف. يمكن تسجيل رسائل الخطأ في ملف مختلف عن إخراج البرنامج العادي.
كما هو الحال عادة ، فإن المزيد من المعرفة يجلب المزيد من الخيارات.
ذات صلة: أفضل أجهزة كمبيوتر Linux المحمولة للمطورين والمتحمسين
اقرأ التاليديف مكاي
- & [رسقوو] ؛ كيفية الاستخدام والدُفعات على Linux لجدولة الأوامر
- & [رسقوو] ؛ سطور الأوامر: لماذا لا يزال الناس يضايقونهم؟
- & [رسقوو] ؛ كيفية استخدام أمر Echo على نظام Linux
- & [رسقوو] ؛ كيفية إنشاء صفحة رجل على نظام Linux
- & [رسقوو] ؛ كيفية معالجة ملف سطر بسطر في برنامج Linux Bash Script
- & [رسقوو] ؛ 15 شخصية خاصة يجب أن تعرفها لباش
- & [رسقوو] ؛ كيفية البحث عن ملف Spotify 2021 الخاص بك
- & [رسقوو] ؛ Cyber Monday 2021: أفضل العروض التقنية
استخدم Dave McKay أجهزة الكمبيوتر لأول مرة عندما كان الشريط الورقي المثقوب رائجًا ، وهو يقوم بالبرمجة منذ ذلك الحين. بعد أكثر من 30 عامًا في صناعة تكنولوجيا المعلومات ، أصبح الآن صحفيًا متخصصًا في مجال التكنولوجيا. خلال مسيرته المهنية ، عمل كمبرمج مستقل ، ومدير فريق تطوير برمجيات دولي ، ومدير مشروع خدمات تكنولوجيا المعلومات ، ومؤخراً كمسؤول حماية البيانات. تم نشر كتاباته على موقع howtogeek.com و cloudavvyit.com و itenterpriser.com و opensource.com. ديف هو مبشر لينكس ومدافع مفتوح المصدر.
اقرأ السيرة الذاتية الكاملة