ما المقصود بـ stdin و stdout و stderr على Linux؟

نافذة المحطة الطرفية على كمبيوتر 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

وهذا بالضبط ما نراه.

تيارات الوعي

تتيح لك معرفة كيفية معرفة ما إذا كانت البرامج النصية الخاصة بك متصلة بالنافذة الطرفية ، أو الأنبوب ، أو يتم إعادة توجيهها ، ضبط سلوكها وفقًا لذلك.

يمكن أن تكون مخرجات التسجيل والتشخيص أكثر أو أقل تفصيلاً ، اعتمادًا على ما إذا كان سينتقل إلى الشاشة أو إلى ملف. يمكن تسجيل رسائل الخطأ في ملف مختلف عن إخراج البرنامج العادي.

كما هو الحال عادة ، فإن المزيد من المعرفة يجلب المزيد من الخيارات.

أوامر لينكس
الملفات قطران · الكهروضوئية · قط · تاك · chmod · سيطرة · فرق · سيد · مع · رجل · Pushd · popd · fsck · اختبار · فيما يليها · فد · باندوك · قرص مضغوط · المسار $ · awk · انضم · جي ق · يطوى · فريد · جورنال سي تي ال · ذيل · حالة · ls · fstab · رما - طرد - قذف · أقل · chgrp · تشاون · مراجعة · نظرة · سلاسل · نوع · إعادة تسمية · أزيز · بفك · تتعدد · أومونت · تثبيت · fdisk · مكفس · جمهورية مقدونيا · rmdir · رسينك · مدافع · gpg · نحن · نانو · مكدير · ال · ln · تصحيح · يتحول · rclone · أجاد · SRM
العمليات الاسم المستعار · شاشة · أعلى · لطيف · رائع · تقدم · دعامة · النظام · تمكس · chsh · التاريخ · في · حزمة · مجانا · التي · dmesg · usermod · ملاحظة · الجذور · xargs · tty · الخنصر · lsof · vmstat · نفذ الوقت · حائط · نعم · قتل · نايم · سودو · له · زمن · المجموعة · usermod · مجموعات · lshw · اغلق · اعادة التشغيل · توقف · انقطاع التيار الكهربائي · passwd · lscpu · كرونتاب · تاريخ · bg · fg
الشبكات netstat · بينغ · مسار التتبع · IP · ss · الذي هو · fail2ban · bmon · أنت · اصبع اليد · nmap · بروتوكول نقل الملفات · لفة · wget · من الذى · من أنا · في · iptables · ssh-كجن · ufw

ذات صلة: أفضل أجهزة كمبيوتر Linux المحمولة للمطورين والمتحمسين

اقرأ التالي صورة الملف الشخصي لـ Dave McKay ديف مكاي
استخدم Dave McKay أجهزة الكمبيوتر لأول مرة عندما كان الشريط الورقي المثقوب رائجًا ، وهو يقوم بالبرمجة منذ ذلك الحين. بعد أكثر من 30 عامًا في صناعة تكنولوجيا المعلومات ، أصبح الآن صحفيًا متخصصًا في مجال التكنولوجيا. خلال مسيرته المهنية ، عمل كمبرمج مستقل ، ومدير فريق تطوير برمجيات دولي ، ومدير مشروع خدمات تكنولوجيا المعلومات ، ومؤخراً كمسؤول حماية البيانات. تم نشر كتاباته على موقع howtogeek.com و cloudavvyit.com و itenterpriser.com و opensource.com. ديف هو مبشر لينكس ومدافع مفتوح المصدر.
اقرأ السيرة الذاتية الكاملة

مقالات مثيرة للاهتمام