يُعد سطر أوامر لينكس أداة قوية تمنح المستخدم تحكمًا كاملًا في النظام، لكن الاستفادة الحقيقية منه تظهر عند فهم كيفية استخدام Pipe وإعادة التوجيه بشكل صحيح. هاتان الميزتان تسمحان بربط الأوامر ببعضها وتمرير المخرجات بمرونة عالية.
استخدام الرمز العمودي Pipe يتيح توجيه ناتج أمر معين إلى أمر آخر لمعالجته مباشرة، بينما تمكّنك أوامر إعادة التوجيه من حفظ النتائج في ملفات أو تعديل طريقة عرض الأخطاء والمخرجات. هذه الأساليب أساسية لأي شخص يعمل في إدارة الأنظمة أو تطوير البرمجيات أو حتى الاستخدام اليومي المتقدم.
في هذا الدليل نشرح مفهوم Pipe وإعادة التوجيه في لينكس، مع أمثلة عملية واضحة تساعدك على كتابة أوامر أكثر كفاءة وتنفيذ مهام معقدة بسطر واحد فقط.
ملخص
- تستفيد أوامر لينكس من Pipe القياسية للإدخال والإخراج ورسائل الخطأ.
- يُرسل التوجيه تدفق الإخراج إلى ملف بدلاً من نافذة الطرفية.
- تتيح لك التدفقات ربط الأوامر معًا، بحيث يصبح مُخرج أحدها مُدخلًا لآخر.
- في لينكس، تُمكّنك التدفقات والتوجيه من استخدام مُخرجات الأوامر بطرق فعّالة. يمكنك حفظها في ملفات، أو استخدامها كمُدخل لأوامر أخرى. إليك ما تحتاج معرفته.
ما هي Pipe ؟
حتوي لينكس، كغيره من أنظمة التشغيل الشبيهة بيونكس، على مفهوم التدفقات. لكل عملية تدفق إدخال يُسمى stdin، وتدفق إخراج يُسمى stdout، وتدفق للأخطاء يُسمى stderr. للتدفقات في لينكس، كما هو الحال في العالم الحقيقي، نقطتا نهاية. لها مصدر (إدخال) ووجهة (إخراج).
قد يأتي تدفق الإدخال من لوحة المفاتيح إلى الأمر، مما يسمح لك بإرسال نصوص، مثل المعلومات أو الأوامر، إلى العملية. أما تدفق الإخراج فيأتي من الأمر، عادةً إلى نافذة الطرفية. يكتب دفق الخطأ القياسي (stderr) أيضًا إلى نافذة الطرفية.
يمكنك إعادة توجيه التدفقات، كما يمكنك توجيهها عبر التدفقات. إعادة التوجيه تعني إرسال المخرجات إلى مكان آخر غير نافذة الطرفية. أما التوجيه عبر التدفقات فيعني أخذ مخرجات أمر ما واستخدامها كمدخلات لأمر آخر.
يتيح لك هذا ربط الأوامر معًا لإنشاء حلول متطورة من سلسلة أوامر بسيطة تعمل بتناغم.
إعادة توجيه التدفقات
أبسط أشكال إعادة التوجيه هو أخذ مخرجات أمر ما وإرسالها إلى ملف. حتى هذه الحالة البسيطة قد تكون مفيدة. ربما تحتاج إلى سجل لمخرجات الأمر، أو ربما يكون هناك كم هائل من المخرجات المتدفقة بحيث يتعذر عليك قراءتها.
على جهاز الكمبيوتر التجريبي هذا، يُخرج الأمر du 1380 سطرًا من النص. سنرسل هذه البيانات إلى ملف.
du > disk-usage.txt
ls /home/dave-mckay/ -R >> disk-usage.txt
wc disk-usage.txt
wc disk-usage.txt missing-file.txt > results.txt
wc: missing-file.txt: No such file or directory
cat results.txt

تُرسل نتائج ملف disk-usage.txt إلى ملف results.txt، بينما تُرسل رسالة الخطأ الخاصة بملف missing-file.txt غير الموجود إلى نافذة الطرفية.
يمكننا إضافة مؤشرات رقمية إلى القوسين الزاويين الأيمنين لتوضيح أي مسار نقوم بإعادة توجيهه. المسار 1 هو stdout والمسار 2 هو stderr. يمكننا إعادة توجيه stdout إلى ملف وstderr إلى ملف آخر بسهولة تامة.
wc disk-usage.txt missing-file.txt 1> results.txt 2> error.txt
cat results.txt
cat error.txt
wc disk-usage.txt missing-file.txt 1> results.txt 2>&1
cat results.txt

تُسجّل جميع رسائل الخطأ وتُرسل إلى نفس الملف الذي تُرسل إليه مخرجات النظام القياسية (stdout).
قد لا ترغب في تخزين أيٍّ من المخرجات على الإطلاق، بل تريد فقط عدم كتابة أي شيء في نافذة الطرفية. يُعدّ ملف الجهاز الفارغ، الذي يستهلك كل ما يُرسل إليه دون تنبيه، وجهةً مناسبةً لإرسال مخرجات الشاشة غير المرغوب فيها.
rm disk-usage.txt missing-file.txt 1> /dev/null 2>&1

لا تُكتب رسائل الإخراج القياسي (stdout) ولا رسائل الخطأ القياسي (stderr) في نافذة الطرفية، على الرغم من أن أحد الملفات التي نحذفها غير موجود.
ومن الحيل الأخرى التي يمكنك استخدامها مع إعادة التوجيه قراءة ملف إلى دفق الإدخال القياسي (stdin) الخاص بالأمر.
wc < /etc/passwd
wc < /etc/passwd > results.txt
cat results.txt
توجيه المخرجات عبر Pipe
تُعيد Pipe توجيه مخرجات أمرٍ ما إلى مدخلات أمرٍ آخر. يُعدّ التوجيه عبر التدفقات من أقوى ميزات سطر الأوامر، ويمكنه تغيير طريقة استخدامك لأوامر وأدوات لينكس الأساسية.
لتوجيه مخرجات أمرٍ ما إلى أمرٍ آخر، نستخدم رمز الأنبوب “|”. على سبيل المثال، إذا أردنا عرض جميع الملفات والمجلدات الفرعية في مجلدك الرئيسي بشكلٍ متكرر، فسترى عرضًا سريعًا لمخرجات الأمر ls في نافذة الطرفية.
بتوجيه مخرجات الأمر ls إلى الأمر less، نحصل على النتائج معروضةً في عارض ملفاتٍ سهل الاستخدام.
ls -R ~ | less

هذه الطريقة أكثر كفاءة من العملية اليدوية المكونة من خطوتين، والتي تتضمن إرسال المخرجات إلى ملف ثم فتحه، وذلك في وقت أقل.
توجيه المخرجات عبر أمر آخر
تظهر فائدة التوجيه بوضوح عندما يقوم الأمر الثاني بمعالجة مخرجات الأمر الأول.
لنحسب عدد حسابات المستخدمين وحسابات المستخدمين الوهميين على جهازك. سنستخدم الأمر cat لعرض محتويات الملف /etc/passwd، ثم نمرر الأمر wc عبره. الخيار -l (عدد الأسطر) سيحسب عدد الأسطر في هذا الملف. وبما أن هناك سطرًا واحدًا لكل حساب، فإنه يحسب الحسابات تلقائيًا.
cat /etc/passwd | wc -l
cat /etc/passwd | awk -F: '{print $1}'
cat /etc/passwd | awk -F: '{print $1}' | sort

توجيه المخرجات عبر سلسلة من الأوامر
إليك مجموعة من أربعة أوامر موصولة بثلاثة Pipe. يعرض الأمر ps قائمة بالعمليات الجارية. الخيار -e (الكل) يعرض جميع العمليات، بينما يحدد الخيار -o (المخرجات) المعلومات المطلوب عرضها. يشير الرمز comm إلى رغبتنا في رؤية اسم العملية فقط.
ثم يتم توجيه قائمة أسماء العمليات إلى الأمر grep، الذي يقوم بتصفية العمليات التي تحتوي على كلمة chrome في اسمها. تُمرر هذه القائمة المُصفاة إلى الأمر sort لترتيبها. ثم تُمرر القائمة المرتبة إلى الأمر uniq. الخيار -c (العدد) يحسب عدد أسماء العمليات الفريدة. وللتجربة، سنكرر العملية نفسها مع متصفح Firefox.
ps -e -o comm | grep chrome | sort | uniq -c
ps -e -o comm | grep firefox | sort | uniq -c
تركيبات لا حصر لها
إتقان استخدام Pipe وإعادة التوجيه في لينكس يفتح أمامك مستوى جديدًا من التحكم والكفاءة في التعامل مع النظام. هذه الأدوات البسيطة ظاهريًا قادرة على اختصار الكثير من الوقت والجهد.
جرّب تطبيق الأمثلة عمليًا على جهازك، وستلاحظ كيف يمكنك تنفيذ مهام معقدة بأوامر مختصرة واحترافية.


