إعادة التوجيه والأنابيب
درس 4 من 11
4إعادة التوجيه والأنابيب
ماذا تشاهد في الرسم: الأسطر تمرّ من أداة إلى أداة عبر الأنبوب، وبعضها يسقط في الطريق، ويخرج في النهاية رقم واحد.
من يكتب sort | uniq -c بلا تفكير يقفز إلى التمارين. والباقي يبدأ من الرسم وينتهي بأن يكتبها بلا تفكير.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
كل أمر مثل آلة صغيرة في مصنع لها فتحة تدخل منها المواد وفتحة تخرج منها النتيجة وفتحة للأخطاء. الأنبوب يوصل مخرج آلة بمدخل الآلة التي بعدها، فتصنع من آلات صغيرة بسيطة خط إنتاج كاملًا. والسهم يحوّل الناتج إلى صندوق (ملف) بدل الشاشة.
لكل عملية ثلاثة تيارات: stdin (0) وstdout (1) وstderr (2). > يكتب المخرج في ملف من جديد، و>> يضيف إليه، و2> يحوّل الأخطاء. و| يربط stdout لأمر بـstdin للتالي، مثل grep error app.log | sort | uniq -c.
قبل أن تبدأ
📟درس الشل
تعرف ls وcat وأن الأمر يطبع نصًّا.
🗂️درس الملف
تعرف أن النص ملف وأن الملف نص.
الفكرة الجوهرية
1ثلاثة أبواب لكل أمر
كل برنامج يولد وله ثلاثة أبواب: مدخل يقرأ منه، ومخرج يكتب فيه نتائجه، ومخرج ثانٍ للأخطاء. افتراضيًّا المدخل لوحة المفاتيح والمخرجان الشاشة.
printf طبع ثلاثة أسطر، و> حوّلها من الشاشة إلى ملف. cat يعرض الملف، وwc -l يعدّ أسطره.
لم تفتح محرّرًا ولم تنقر. كتبت ملفًا بسهم واحد. هذا هو باب الإخراج وقد غيّرت وجهته.
printf "apple\nbanana\ncherry\n" > fruits.txt cat fruits.txt wc -l fruits.txt
الناتج:
apple banana cherry 3 fruits.txt
2> يكتب من جديد و>> يضيف و2> للأخطاء
> يمسح الملف ويكتب من البداية. >> يضيف في النهاية. أغلب الملفات المفقودة سببها > في موضع >>.
الأخطاء تخرج من الباب الثاني، فلا يمسكها >. 2> يمسكها. ورمز الخروج $? يقول هل نجح الأمر: صفر نجاح، وغيره فشل.
echo first > log.txt echo second >> log.txt cat log.txt ls /nonexistent 2> errors.txt echo "exit code: $?" cat errors.txt
الناتج:
first second exit code: 2 ls: cannot access '/nonexistent': No such file or directory
3الأنبوب: مخرج أمر مدخل الذي بعده
| يأخذ ما يكتبه الأمر الأيسر ويعطيه للأيمن كمدخل، بلا ملف وسيط. تابع الرسم: cat يخرج الأسطر، وgrep يحتفظ بما يطابق، وwc يعدّ.
grep an احتفظ بالسطر الذي فيه an. وgrep -c a عدّ الأسطر التي فيها حرف a مباشرة من الملف بلا أنبوب. كلا الطريقين صحيح، والأنبوب يفيد عندما تطول السلسلة.
printf "apple\nbanana\ncherry\n" > fruits.txt cat fruits.txt | grep an grep -c a fruits.txt
الناتج:
banana 2
4أدوات صغيرة تصنع تقريرًا
أربع أدوات في سطر: sort يرتّب، وuniq -c يدمج المتكرّر المتجاور ويعدّه، وsort -rn يرتّب بالعدد تنازليًّا. النتيجة: الأكثر تكرارًا في الأعلى.
هذه الجملة بعينها تحلّل سجلّات خوادم حقيقية كل يوم: استبدل الأحرف بعناوين زوّار وستعرف من يزورك أكثر. لم تكتب برنامجًا، ركّبت أربعة.
printf "b\na\nb\nc\na\nb\n" | sort | uniq -c | sort -rn
الناتج:
3 b
2 a
1 cكيف يعمل، خطوة بخطوة: كيف يبني الشل الأنبوب
يقرأ الشل السطر ويرى |، فيقسّمه إلى أوامر.
ينشئ لكل أمر عملية، ويصل مخرج كل واحدة بمدخل التي بعدها.
تعمل العمليات معًا: ما إن يخرج سطر من الأولى حتى تقرأه الثانية.
النتيجة النهائية فقط تصل إلى الشاشة أو إلى ملف إن وجّهتها.
مثال محلول
ls يطبع الأسماء سطرًا سطرًا، وgrep '\.txt$' يبقي ما ينتهي بـ.txt، وwc -l يعدّ. السطر كاملًا: ls | grep '\.txt$' | wc -l. ثلاث أدوات، ولا واحدة منها تعرف شيئًا عن الأخرى.خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| الأنبوب ينسخ الملفات بين الأوامر. | لا ملف في الطريق أصلًا؛ النص يمرّ في الذاكرة من عملية إلى عملية مباشرة. |
| > و>> متشابهان وأيهما صحّ. | > يمسح ما كان، و>> يضيف. الخلط بينهما أشهر طريقة لفقدان ملف سجلّ. |
| الأخطاء جزء من الناتج العادي. | لها باب مستقل رقمه 2، ولهذا تستطيع حفظ الناتج في ملف وإبقاء الأخطاء على الشاشة أو العكس. |
جرّب بنفسك
كتبت ls > list.txt 2> errors.txt ثم نظرت فوجدت list.txt فارغًا وerrors.txt فيه نص. ماذا حدث؟
الناتج العادي ذهب إلى list.txt والأخطاء إلى errors.txt كما طلبت. ملف فارغ وآخر فيه نص يعني أن الأمر فشل، مثل مجلد غير موجود، فكتب في باب الأخطاء فقط.
بطاقات مراجعة سريعة
$? يساوي 0؟تحقق من فهمك
لماذا لا يمسك > رسائل الخطأ؟
لأنها تخرج من الباب رقم 2 لا من المخرج القياسي، و> يحوّل المخرج القياسي فقط.
ما الذي يحدث لو كتبت sort | uniq -c بلا sort؟
uniq يدمج المتكرّر المتجاور فقط، فيبقى التكرار المتباعد منفصلًا وتخرج الأعداد خاطئة.
متى تفضّل ملفًا وسيطًا على الأنبوب؟
عندما تحتاج النتيجة الوسيطة لاحقًا أو تريد فحصها؛ الأنبوب يفيد عندما تهمّك النتيجة النهائية فقط.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
مقالات1
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.