كل برنامج له تلات أبواب
الافتراضي: الكيبورد يدخل، والشاشة تاخد الاتنين طالعين. تقدر تغيّر الاتجاه من غير ما تغيّر البرنامج.
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 عشان الكسر اللي في النص يظهر.
المتغيرات والتنصيص
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 فين؟
> بتحوّل stdout.٢) ليه المتغير جوه تنصيص مزدوج أحسن من سيبه من غير تنصيص؟
٣) rm *.txt مين اللي بيلاقي الملفات؟
rm يشتغل. البرنامج بيستلم الأسماء جاهزة.