مقدمة في إعادة توجيه الإدخال/الإخراج في Linux

مقدمة

توفر قدرات إعادة التوجيه المدمجة في نظام التشغيل Linux مجموعة قوية من الأدوات لتحسين العديد من سير العمل. فلسفة “يونيكس” لتطوير البرمجيات كانت أن تجعل الأدوات تقوم بشيء واحد جيدًا، وقد تم نقل هذه الفلسفة إلى أدوات سطر الأوامر الحديثة، التي هي قوية بشكل فردي، وأكثر فعالية بشكل متسارع عندما تجتمع. سواء كنت تكتب برمجيات معقدة أو تعمل فقط على سطر الأوامر، فإن معرفة كيفية التحكم في التيارات المختلفة للمدخلات والمخرجات في بيئتك ستزيد من إنتاجيتك بشكل كبير.

المتطلبات المسبقة

لمتابعة هذا الدليل، ستحتاج إلى الوصول إلى خادم Linux. إذا كنت بحاجة إلى معلومات حول الاتصال بالخادم الخاص بك لأول مرة، يمكنك متابعة دليلنا حول الاتصال بخادم Linux باستخدام SSH.

التيارات

توزع المدخلات والمخرجات في بيئة Linux عبر ثلاثة تيارات. هذه التيارات هي:

  • الإدخال القياسي (stdin)

  • الإخراج القياسي (stdout)

  • خطأ قياسي (stderr)

تتم تسمية التدفقات أيضًا بأرقام:

  • stdin (0)

  • stdout (1)

  • stderr (2)

أثناء التفاعلات القياسية بين المستخدم والطرفية، يأتي الإدخال القياسي من لوحة المفاتيح الخاصة بالمستخدم. يتم عرض الإخراج القياسي وخطأ القياسي على شاشة المستخدم كنص. بشكل عام، يُشار إلى الثلاث تدفقات باسم التدفقات القياسية.

الإدخال القياسي

تحمل تدفق الإدخال القياسي عادة البيانات من المستخدم إلى البرنامج. البرامج التي تتوقع الإدخال القياسي عادةً تستقبل الإدخال من جهاز، مثل لوحة المفاتيح. في وقت لاحق في هذا البرنامج التعليمي، سترى أمثلة على استخدام إخراج برنامج واحد كإدخال قياسي لبرنامج آخر.

المخرج القياسي

المخرج القياسي هو الإخراج الذي يتم توليده بواسطة برنامج. عندما لا يتم توجيه مجرى الإخراج القياسي، فسيقوم بإخراج النص مباشرة إلى الطرفية. حاول إخراج بعض النصوص التي لا معنى لها، باستخدام echo:

  1. echo Sent to the terminal
Output
Sent to the terminal

عند استخدامه بدون أي خيارات إضافية، تقوم أمر echo بإخراج أي argument يتم تمريره إليه في سطر الأوامر.

قم بتشغيل الأمر echo بدون أي arguments:

  1. echo

سيُعيد سطرًا فارغًا. بعض البرامج لا تفعل أي شيء بدون توفير arguments.

الخطأ القياسي

الخطأ القياسي يحتوي على الأخطاء التي يتم توليدها بواسطة برنامج فشل بطريقة ما. مثل المخرج القياسي، الوجهة الافتراضية لهذا المجرى هي شاشة العرض في الطرفية.

لنرى مثالًا أساسيًا على الخطأ القياسي باستخدام أمر ls. يقوم ls بتسريد محتويات الدليل.

عند تشغيله بدون argument، يقوم ls بتسريد المحتويات ضمن الدليل الحالي. إذا تم تشغيل ls مع دليل كargument، فسيقوم بتسريد محتويات الدليل المُقدم.

  1. ls %

نظرًا لأن % ليس دليلاً موجودًا، سيتم إرسال النص التالي إلى الخطأ القياسي:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

توجيه التدفق

يتضمن نظام Linux أوامر توجيه لكل تدفق. يمكن استخدام هذه لكتابة الإخراج القياسي أو الخطأ القياسي إلى ملف. إذا كتبت إلى ملف لا يوجد، سيتم إنشاء ملف جديد بهذا الاسم قبل الكتابة.

الأوامر ذات القوس الواحد تستبدل محتويات الوجهة الحالية.

الاستبدال

  • > – الإخراج القياسي

  • < – الإدخال القياسي

  • 2> – الخطأ القياسي

الأوامر ذات القوس المزدوج لا تستبدل محتويات الوجهة الحالية.

الإلحاق

  • >> – الإخراج القياسي

  • << – الإدخال القياسي

  • 2>> – الخطأ القياسي

الأنابيب

تُستخدم الأنابيب لإعادة توجيه التيار من برنامج إلى آخر. عندما يتم إرسال الإخراج القياسي لبرنامج ما إلى آخر من خلال أنبوب، سيتم استخدام إخراج البرنامج الأول كإدخال للثاني، بدلاً من طباعته إلى الطرفية. سيتم عرض البيانات فقط التي يعيدها البرنامج الثاني.

يُمثل الأنبوب في نظام التشغيل لينكس بشريط عمودي: |

إليك مثالًا على أمر يستخدم الأنبوب:

  1. ls | less

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

ls يعرض عادة محتويات الدليل عبر صفوف متعددة. عند تشغيله عبر less، يتم وضع كل إدخال في سطر جديد.

على الرغم من أن وظيفة الأنبوب قد تبدو مماثلة لتلك التي لها علامات > و >>، إلا أن التمييز يكمن في أن الأنابيب تعيد توجيه البيانات من أمر إلى آخر، بينما > و >> تُستخدمان لإعادة التوجيه بشكل حصري إلى الملفات.

مرشحات

المرشحات هي فئة من البرامج التي عادة ما تُستخدم مع المخرجات الموجهة من برنامج آخر. العديد منها مفيدة أيضًا بمفردها، ولكنها توضح سلوك التوجيه بشكل خاص.

  • find – يُرجع الملفات التي تطابق أسماء الملفات المرسلة كوسيط لـ find.

  • grep – يُرجع النص الذي يطابق نمط السلسلة المرسلة لـ grep.

  • tee – يوجه المدخل القياسي إلى كل من المخرج القياسي وملف واحد أو أكثر.

  • tr – يجد ويستبدل سلسلة بأخرى.

  • wc – يحسب الأحرف والأسطر والكلمات.

أمثلة

الآن بعد أن تم تقديم التوجيه والتوجيه والمرشحات الأساسية، دعونا نلقي نظرة على بعض أنماط وأمثلة التوجيه الشائعة.

نمط الأمر > ملف يعيد توجيه الإخراج القياسي لأمر ما إلى ملف.

  1. ls ~ > root_dir_contents.txt

الأمر أعلاه يمر بمحتويات دليل المستخدم الخاص بك (~) كإخراج قياسي، ويكتب الإخراج إلى ملف يسمى root_dir_contents.txt. سيتم حذف أي محتويات سابقة في الملف، لأنه أمر بقوس واحد.

نمط الأمر > /dev/null يعيد توجيه الإخراج القياسي إلى مكان لا شيء. /dev/null هو ملف خاص يُستخدم للتخلص من أي بيانات يتم توجيهها إليه. يُستخدم للتخلص من الإخراج القياسي الذي لا يُحتاج إليه، والذي قد يتداخل خلاف ذلك مع وظيفة أمر أو نص. يتم التخلص من أي إخراج يُرسل إلى /dev/null.

  1. ls > /dev/null

يتخلص هذا الأمر من تيار الإخراج القياسي المُرجع من قِبل الأمر ls من خلال توجيهه إلى /dev/null.

نمط الأمر 2> ملف يعيد توجيه تيار الخطأ القياسي لأمر ما إلى ملف، مع استبدال المحتويات الحالية.

  1. mkdir '' 2> mkdir_log.txt

يقوم هذا بتوجيه الخطأ الذي تم إثارته بسبب اسم الدليل غير الصالح ''، ويكتبه إلى log.txt. يرجى ملاحظة أن الخطأ ما زال يُرسل إلى الطرفية ويُعرض كنص.

نمط الأمر >> ملف يعيد توجيه الإخراج القياسي لأمر ما إلى ملف دون استبدال محتويات الملف الحالية.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

هذا الزوج من الأوامر يوجه أولاً النص الذي أدخله المستخدم من خلال echo إلى ملف جديد. ثم يُلحق النص الذي تلقاه الأمر الثاني echo بالملف الحالي، دون استبدال محتوياته.

نمط command 2>> file أعلاه يوجه تيار الخطأ القياسي من أمر إلى ملف دون أن يحذف محتويات الملف الحالية. هذا النمط مفيد لإنشاء سجلات الأخطاء لبرنامج أو خدمة، حيث لن يتم محو محتوى الملف السابق في كل مرة يتم فيها كتابة الملف.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

يوجه الأمر أعلاه رسالة الخطأ الناجمة عن وجود argument find غير صالح إلى ملف يُسمى stderr_log.txt. ثم يلحق رسالة الخطأ الناجمة عن وجود argument wc غير صالح بنفس الملف.

نمط command | command يوجه الإخراج القياسي من الأمر الأول إلى الإدخال القياسي للأمر الثاني.

  1. find /var lib | grep deb

يبحث هذا الأمر في /var ومجلداته عن أسماء ملفات وامتدادات تطابق السلسلة deb، ويُعيد مسارات الملفات، مع تمييز الجزء المُطابق في كل مسار باللون الأحمر.

نمط command | tee file (الذي يتضمن أمر tee) يوجه الإخراج القياسي للأمر إلى ملف ويُحذف محتوياته. ثم، يعرض الإخراج الموجَّه في الطرفية. ينشئ ملفًا جديدًا إذا لم يكن الملف موجودًا بالفعل.

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

  1. wc /etc/magic | tee magic_count.txt

هذا ينقل العدادات للأحرف والأسطر والكلمات في ملف /etc/magic (المستخدم من قبل قشرة Linux لتحديد أنواع الملفات) إلى أمر الـ tee، الذي بدوره يقسم إخراج wc إلى اتجاهين، ويُرسله إلى عرض الطرفية وملف magic_count.txt. بالنسبة لأمر tee، تخيل حرف T. الجزء السفلي من الحرف هو البيانات الأصلية، والجزء العلوي هو البيانات التي يتم تقسيمها إلى اتجاهين مختلفين (الإخراج القياسي والطرفية).

يمكن استخدام أنابيب متعددة لتوجيه الإخراج عبر أوامر و/أو مرشحات متعددة.

الاستنتاج

تعلم كيفية استخدام قدرات التحويل المدمجة في سطر الأوامر في Linux مهارة أساسية. الآن بعد أن رأيت أساسيات كيفية عمل التحويلات والأنابيب، ستكون قادرًا على بدء رحلتك في عالم كتابة السيناريوهات القشرية، التي تستخدم بشكل متكرر البرامج والأنماط المسلطة الضوء عليها في هذا الدليل.

البحث عن أوامر محددة، أو عن شيء ترغب في القيام به في سطر الأوامر (مثل “حذف جميع الملفات في دليل تبدأ بحرف كبير”) يمكن أيضًا أن يكون مفيدًا عندما تحتاج إلى إنجاز مهمة محددة باستخدام سطر الأوامر.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection