الأمر · فصل ٤

مفاهيم من غيرها السطر بيكدب

exit code · stdin stdout stderr · quoting · glob · variables
🎯 الهدف: تفهم المخرج والمدخل، وليه التنصيص والـ glob بيحصلوا في الشيل قبل البرنامج.

كل برنامج له تلات أبواب

stdin — اللي داخل (0)stdout — الناتج العادي (1)stderr — الغلط والتحذير (2)

الافتراضي: الكيبورد يدخل، والشاشة تاخد الاتنين طالعين. تقدر تغيّر الاتجاه من غير ما تغيّر البرنامج.

terminal
echo hi > out.txtecho more >> out.txtwc -l < out.txtrm missing 2> err.txtgrep x menu.txt > hits.txt 2>/dev/null

> يكتب الملف من الأول، والقديم يضيع. >> يزوّد في الآخر. < يقرأ من ملف بدل الكيبورد. 2> يحوّل الغلط بس. 2>&1 يودّي الغلط لنفس حتة المخرج العادي. /dev/null سلة: اللي يروح هناك يختفي.

الـ pipe يوصّل stdout بس. stderr يفضل على الشاشة إلا لو حوّلته. في bash، |& يوصّل الاتنين.

البرنامج مش عارف إن فيه شاشة. هو بيكتب على باب. الشيل هو اللي موصّل الباب بالشاشة أو بملف أو بأمر تاني.

رقم الخروج هو اللي بيحكم

$? آخر رقم خروج. true بيرجع صفر. false بيرجع واحد. grep بيرجع ١ لو ملقّاش تطابق، وده مش دايمًا “البرنامج وقع”. اقرأ معنى الرقم في man قبل ما تبني عليه &&.

في pipeline من غير pipefail، رقم الخروج بتاع آخر أمر بس. grep يفشل و wc ينجح، السلسلة تبان ناجحة. في السكربت هنفعّل pipefail عشان الكسر اللي في النص يظهر.

المتغيرات والتنصيص

terminal
name="كشري"echo "$name"echo "$name extra"

متحطّش مسافة حوالين =. name = x الشيل يفهمها أمر اسمه name. التنصيص المزدوج يخلي القيمة كلمة واحدة حتى لو فيها مسافة، ويظل يفك $. التنصيص المفرد يجمّد كل حاجة: echo '$name' يطبّع الرمز نفسه مش قيمة المتغير.

تنصيص مزدوج

يفك المتغيرات. يحمي من تقطيع الكلمات. ده الافتراضي الصح حوالين أي قيمة جاية من بره.

تنصيص مفرد

حرفي. مفيش فك لـ $ ولا أمر جوه. لما عايز النص يفضل كما هو.

export NAME=value يخلّي المتغير يعدّي للبرامج اللي الشيل هيشغّلها. من غيره، المتغير سر الشيل ومش هيشوفه python ولا برنامج تاني. PATH نفسه متغير محيط: قائمة فولدرات الشيل بيدوّر فيها على الأوامر، مفصولة بـ :.

الشيل بيوسّع السطر قبل البرنامج

الترتيب المهم عمليًا:

$(date) يحط ناتج الأمر مكانه. الأقواس أحسن من العلامة القديمة اللي شبه التنصيص العكسي، لأنها بتتداخل بوضوح.

النجمة * والعلامة ? اسمهم glob. الشيل يبدّلهم بأسماء ملفات قبل ما rm أو ls يشوفوا السطر. rm *.log مش بيبعت النجمة للبرنامج. بيبعت قائمة الملفات. لو مفيش تطابق، bash يسيّب النجمة كنص، وده مفاجأة في السكربتات.

حاجات صغيرة بتوفر سطر

~ البيت بتاعك، بس في أول الكلمة. $((1 + 2)) حساب أعداد صحيحة. {a,b} يكرّر الأمر: mkdir {src,dist} يعمل الاتنين. متستخدمهاش وهي متغطية بتنصيص، لأن التوسيع مش هيحصل.

الأمر المبني cd و export و exit و source (أو .) بيأثر على الشيل الحالي. source file.sh يشغّل الملف جوه شيلّك، فمتغيراته تفضل. تشغيله بـ ./file.sh شيل ابن، ولما يخلّص متغيراته تموت.

خلّصت الفصل لما

🧠 اختبر نفسك
١) echo hi > f هيحط hi فين؟
في الملف f، مش على الشاشة. > بتحوّل stdout.
٢) ليه المتغير جوه تنصيص مزدوج أحسن من سيبه من غير تنصيص؟
التنصيص يخلي القيمة كلمة واحدة لو فيها مسافة أو فاضية.
٣) rm *.txt مين اللي بيلاقي الملفات؟
الشيل، قبل ما rm يشتغل. البرنامج بيستلم الأسماء جاهزة.