سطر الأوامر وسكربتات Shell
💡 دليل التعلم: يهدف هذا الفصل إلى تزويد القراء بدون خلفية تقنية بفهم منهجي لكيفية عمل الطرفية (Terminal). لا حاجة لخلفية في علوم الحاسوب، سنقوم من خلال عروض تفاعلية بتحليل آلية عمل الطرفية خطوة بخطوة.
0. البدء السريع: كيف تفتح الطرفية؟
قبل أن تبدأ التعلم، عليك أولاً أن تجدها. الطرفية تأتي "مثبتة مسبقاً" في كل نظام تشغيل، ولا تحتاج لتثبيت أي برنامج إضافي لاستخدامها.
🖥️ طريقة الفتح في الأنظمة المختلفة
macOS (ماك)
- اضغط
Command (⌘) + Spaceلفتح بحث Spotlight. - اكتب
Terminal. - اضغط Enter، وستظهر نافذة بخلفية بيضاء ونص أسود (أو العكس).
🪟 Windows
- الطريقة 1 (CMD): اضغط
Win + R، اكتبcmd، ثم Enter. هذا هو سطر الأوامر الأقدم. - الطريقة 2 (PowerShell): اضغط
Win + R، اكتبpowershell، ثم Enter. هذه طرفية أكثر حداثة وقوة. - نصيحة: للعمليات اليومية البسيطة كلاهما مناسب، ولبيئة التطوير يُنصح باستخدام PowerShell أو تثبيت WSL (Windows Subsystem for Linux).
🐧 Linux
- عادةً الاختصار هو
Ctrl + Alt + T. - أو ابحث عن
Terminalفي قائمة التطبيقات.
0.1 تطبيق عملي: جرّب بنفسك (Hands-on Lab)
التطبيق أفضل من النظرية. قبل الدخول في المبادئ الجافة، لنجرّب معاً الإحساس بـ "كتابة الأوامر".
💡 نصيحة: للسلامة والراحة، ننصحك بالتدرب على المحاكي الويب أدناه. إذا كنت واثقاً، يمكنك أيضاً فتح الطرفية الحقيقية على جهازك باتباع خطوات الفصل 0 والمتابعة معنا (النتيجة واحدة).
في هذا التمرين ستتعلم:
- عرض الملفات: تعلم استخدام
lsأوdirلمعرفة ما يوجد في المجلد الحالي. - الإنشاء والدخول: تعلم استخدام
mkdirلإنشاء مجلد جديد، وcdللدخول إليه كبوابة انتقال. - إنشاء ملف جديد: تعلم إنشاء ملف جديد بسرعة باستخدام أمر.
- تثبيت البرامج: تجربة متعة تثبيت مكتبة Python أو برنامج نظام بسطر واحد.
- الحذف والتنظيف: تعلم كيفية حذف الملفات غير الضرورية (استخدم بحذر!).
- سؤال الذكاء الاصطناعي: هذا هو الأهم! عندما تنسى أمراً، تعلم أن تسأل الذكاء الاصطناعي: "كيف أحذف ملفاً على Mac؟"، وسيعطيك الإجابة مباشرة.
اختر نظام التشغيل الذي تستخدمه عادةً أدناه، ثم اتبع التعليمات:
Step 1: See What's Here
Before working with files, we first need to know what files are in the current directory.
In Windows CMD, use the `dir` command (Directory) to view file lists.
0.2 لماذا نتخلى عن الفأرة؟ (Why CLI?)
قد تتساءل: "الواجهات الرسومية (GUI) سهلة الاستخدام لدرجة أن النقر بالفأرة يكفي، فلماذا نكتب أوامر معقدة في نافذة سوداء؟"
الأمر ليس "للتباهي"، بل لأن في سيناريوهات محددة، اللغة (الأوامر) أقوى من الإيماءات (الفأرة).
1. الفأرة لا تستطيع التعبير عن "الكمّ" و"المنطق"
- GUI (الفأرة): مناسبة لـ "انقر على ما تراه". إذا أردت حذف صورة، النقر بزر الأيمن وحذفها سريع. لكن إذا أردت "حذف جميع صور عام 2023، التي تزيد عن 5 ميجابايت، وبصيغة PNG"، الفأرة عاجزة، وقد تحتاج للتصفية اليدوية لفترة طويلة.
- CLI (الأوامر): مناسبة لـ "وصف ما تريد فعله". المتطلب السابق يحتاج سطر أوامر واحد فقط، وسيبحث الحاسوب تلقائياً عن الملفات المطابقة ويعالجها، حتى لو كانت 10000 ملف.
2. الأوامر يمكن تسجيلها وإعادة استخدامها
- GUI: تقوم بإعداد البيئة مرة واحدة بالنقر على عشرات القوائم. عند تغيير الحاسوب، عليك إعادة النقر من الذاكرة، ومن السهل نسيان خطوات.
- CLI: يمكنك كتابة جميع الأوامر في ملف (سكربت). في المرة القادمة تحتاج فقط لتشغيل هذا الملف، وسيُعيد الحاسوب عملياتك بدون أي خطأ. هذا هو أساس "الأتمتة".
3. الخيار الوحيد للتحكم عن بُعد
- GUI: نقل الصور مثل مشاهدة فيديو عالي الدقة، يحتاج سرعة إنترنت عالية جداً. إذا كانت الشبكة بطيئة قليلاً، ستتعطل الفأرة ولن تتمكن من العمل.
- CLI: ينقل فقط نصاً عادياً، بضعة عشرات من الأحرف. حتى لو كنت في منطقة جبلية بإشارة ضعيفة جداً، يمكنك التحكم بسلاسة في خادم مركز بيانات على الجانب الآخر من العالم.
الخلاصة: GUI مناسبة للاستكشاف (تصفح الويب، عرض الصور)، و CLI مناسبة للإنتاج (التطوير، العمليات، المعالجة المجمعة). كمطورين، نستخدم الطرفية لأنها أكثر دقة وأكثر تحكماً وأكثر كفاءة.
1. تعريف المفاهيم: ما هي الطرفية؟ (Definition)
الطرفية تبدو مختلفة في كل نظام تشغيل، وطريقة الأوامر مختلفة أيضاً. انقر على الأزرار أدناه للتبديل، ولاحظ كيف يستخدم macOS و Windows و Linux أوامر مختلفة (مثل dir مقابل ls) لإنجاز نفس الشيء:
قبل انتشار واجهات المستخدم الرسومية (GUI)، كانت الطرفية هي الوسيلة الرئيسية للتفاعل بين الإنسان والحاسوب. وحتى اليوم، تبقى الأداة الأكثر دقة وكفاءة للمطورين للتحكم في الحاسوب.
CLI (Command Line Interface): In this mode, the computer only understands characters. Each key press is converted to an encoding and sent to the system, which processes it and returns text results. It doesn't care where you click, only what you type.
في جوهرها، الطرفية هي بيئة إدخال/إخراج لتدفق الأحرف:
- الإدخال: إرسال التعليمات (إشارات الأحرف) عبر لوحة المفاتيح.
- الإخراج: عرض الملاحظات النصية عبر شبكة على الشاشة.
لا تعالج الرسومات المعقدة أو الصور أو الفيديوهات، بل تركز على التفاعل مع المعلومات النصية.
2. البنية الأساسية: فن الفصل (The Big Picture)
قبل التعمق، فكر في هذا: هل نافذة الطرفية فعلاً تفهم ما تقوله؟
في الواقع، الطرفية مثل شاشة تنقل الرسائل فقط. عندما تكتب الأمر date، الطرفية لا تعرف أن هذا يعني "عرض التاريخ"، بل تقوم فقط بتعبئة هذه الأحرف الأربعة وإرسالها للرئيس الحقيقي في الخلفية: Shell.
Shell هو "العقل" الذي يفهم كلامك ويوجه الحاسوب للعمل.
لفهم كيف يتعاونان، دعنا نلقي نظرة على هؤلاء "الثلاثة العمال" ذوي الأدوار المحددة. أفضل تشبيه لفهم علاقتهم هو المتصفح وخادم الويب.
2.1 توزيع الأدوار
🖥️ الطرفية —— مثل "المتصفح"
- المسؤولية: مسؤولة فقط عن الإدخال (نقل ضغطات مفاتيحك للطرف الآخر) والعرض (رسم الأحرف العائدة من الطرف الآخر على الشاشة).
- الخصائص: ليس لديها أي ذكاء، ولا تعرف ما هو
lsأوcd. مثل متصفح Chrome، سواء زرت جوجل أو غيرها، فهو يعرض الصفحة فقط. - الطرفيات الشائعة: نافذة CMD/PowerShell في Windows، Terminal.app في macOS، الطرفية المدمجة في VS Code.
🧠 Shell —— مثل "خادم الويب"
- المسؤولية: هو العقل ذو المنطق. يعمل في الخلفية، يستقبل سلسلة الأوامر التي ترسلها، يحلل معناها، ثم يوجه نظام التشغيل للعمل.
- الخصائص: غير مرئي وغير ملموس، يتواصل مع الخارج فقط عبر تدفقات النص.
- Shells الشائعة: Bash, Zsh, Fish, PowerShell.
⚙️ النواة (Kernel) —— "المدير" في الخلفية
- المسؤولية: قلب نظام التشغيل، وهو الوحيد الذي يتحكم مباشرة بالعتاد (قراءة/كتابة الأقراص، تخصيص الذاكرة، التحكم بالمعالج).
- العلاقة: Shell هو "سكرتير" النواة، يترجم لغتك البشرية للنواة.
2.2 لماذا الفصل؟ (القابلية للاستبدال)
لأن طبقة العرض (الطرفية) وطبقة المنطق (Shell) مفصولتان تماماً، يمكن دمجهما بحرية:
- تغيير "المظهر": على macOS يمكنك استخدام Terminal الافتراضي، أو تحميل iTerm2، أو استخدام طرفية VS Code. مظهرها مختلف لكنها جميعاً تتصل بنفس Shell (zsh)، لذا الأوامر متطابقة.
- تغيير "العقل": في نفس نافذة الطرفية، يمكنك التبديل من bash إلى zsh، أو الدخول لبيئة Python التفاعلية. الطرفية لم تتغير، لكن منطق معالجة الأوامر تغيّر.
2.3 تدفق التفاعل: ضغطة المفتاح المختفية
قد تعتقد: "عندما أضغط 'a' على لوحة المفاتيح، الطرفية ترسم 'a' على الشاشة."خطأ! العملية الحقيقية كالتالي (هذا يسمى الصدى Echo):
- ضغط 'a': إشارة لوحة المفاتيح تصل للطرفية.
- إرسال الإشارة: الطرفية ترسل رمز 'a' للـ Shell.
- معالجة Shell: Shell يستقبل 'a'، لا يجد مشكلة، فيعيد 'a' كما هي للطرفية.
- عرض الحرف: الطرفية تستقبل 'a' المرجع من Shell، عندها فقط يرسمه على الشاشة.
💡 تجربة صغيرة: بعض الأوامر (مثل إدخال كلمة المرور) تعطل وظيفة الصدى في Shell. في هذه الحالة تضغط على المفاتيح، الطرفية ترسلها للـ Shell، لكن Shell لا يعيد شيئاً، فتبقى الشاشة فارغة تماماً. هذا لحماية الخصوصية.
ملخص التدفق بجملة واحدة: تكتب في الطرفية ➡️ الإشارة تنتقل للـ Shell ➡️ Shell يعيدها كما هي (ترى الأحرف) ويفهمها ➡️ Shell يوجه النواة للعمل.
العرض التوضيحي أدناه يوضح هذه العملية، لاحظ "الجدار" بين Shell والنواة، وكيف تذهب الأحرف وتعود:
3. النموذج المرئي: نظام الشبكة (The Grid System)
عكس الواجهات الرسومية الحديثة التي تستخدم "البكسلات"، أساس عرض الطرفية هو شبكة أحرف (Character Grid). شاشة الطرفية مقسمة إلى صفوف وأعمدة، كل خلية تسمى Cell.
3.1 تكوين الخلية
كل Cell هي وحدة العرض الأصغر في الطرفية، وتحتوي على نوعين من المعلومات الأساسية:
- الرسم (Glyph): النص المعروض فعلياً (مثل
A,ع,$). - السمات (Attributes): نمط الحرف (مثل اللون الأمامي، لون الخلفية، الخط العريض، التسطير).
عندما تسحب نافذة الطرفية لتغيير حجمها، أنت فعلياً تغير عدد الصفوف (Rows) والأعمدة (Columns) في هذه الشبكة.
جرّب العمل في المنطقة التفاعلية أدناه، ولاحظ كيف تحتضن الشبكة الأحرف:
3.2 فحص الأنماط
الطرفية لا تستطيع عرض الصور، كل "الواجهات" تُنشأ من خلال مجموعات ألوان وأنماط الأحرف.
انقر على الخلايا أدناه لعرض سمات النمط المخفية خلف كل خلية:
4. بروتوكول الاتصال: تسلسلات الهروب (Escape Sequences)
قد تتساءل: إذا كانت الطرفية تنقل النص فقط، فكيف تتحقق الأحرف الملونة، وحركة المؤشر، ومسح الشاشة؟
الجواب هو تسلسلات الهروب (Escape Sequences). هي سلسلة من تعليمات الأحرف الخاصة (عادة تبدأ بحرف ESC). عندما تستقبل الطرفية هذه الأحرف، لا تعرضها على الشاشة، بل تفسرها كـ أوامر تحكم.
على سبيل المثال:
- الحرف العادي
A→ يرسم A على الشاشة. - التسلسل
\033[31m→ أمر: تغيير لون النص التالي إلى الأحمر. - التسلسل
\033[2J→ أمر: مسح الشاشة.
وكأنك تتفق مع صديقك: إذا تحدثت بشكل طبيعي، سيسجل؛ وإذا رفعت يدي اليسرى (ما يعادل ESC)، فما يليه هو أمر وليس محتوى.
انقر على زر "تشغيل" أدناه، ولاحظ كيف تعالج الطرفية تدفق الأحرف واحداً تلو الآخر وتتعرف على الأوامر المخفية:
Normal mode: Characters go directly to screen. Escape mode (after ESC ): Terminal stops output and starts collecting characters as commands until the command ends (e.g. m) and executes.
المكون أدناه يعرض أنواعاً إضافية من تسلسلات الهروب وتأثيرات عرضها:
5. آلية الإدخال: تدفق البايتات (Input as Byte Stream)
غالباً يُساء فهم عملية الإدخال. عندما تضغط على مفتاح، الطرفية لا "ترسم" الحرف مباشرة على الشاشة، بل تقوم بـ نقل مشفّر.
- التقاط المفتاح: الطرفية تلتقط ضغطتك الفعلية على المفتاح.
- تحويل الترميز: تحول المفتاح إلى تسلسل بايت محدد.
- ضغط
a→ يرسل بايتa. - ضغط
السهم للأعلى→ يرسل التسلسل^[[A.
- ضغط
- الإرسال: يرسل تدفق البايتات للـ Shell أو البرنامج قيد التشغيل.
النقطة الأساسية: جميع المفاتيح (بما فيها مفاتيح الوظائف ونقرات الفأرة) على مستوى النقل هي بيانات بايت.
جرّب الضغط على المفاتيح أدناه، ولاحظ كيف يتحول إدخالك إلى بيانات منخفضة المستوى:
6. أوضاع التشغيل: الآلة الكاتبة مقابل جهاز الألعاب (Cooked vs. Raw Mode)
الطرفية لها شخصيتان مختلفتان تماماً. فهم هذا سيجعلك تدرك لماذا كتابة الأوامر ولعب لعبة الثعبان في الطرفية تجربتان مختلفتان تماماً.
الوضع المعالج (Cooked Mode) —— مثل الآلة الكاتبة
- هذا هو الوضع الافتراضي.
- السلوك: الأحرف التي تكتبها يتم احتجازها مؤقتاً بواسطة الطرفية حتى تضغط Enter.
- الميزة: تعطيك فرصة للتصحيح. أخطأت؟ اضغط Backspace للمسح وإعادة الكتابة، البرنامج لن يعرف أبداً أنك أخطأت.
- سيناريو الاستخدام: كتابة الأوامر المعتادة (مثل
ls,cd).
الوضع الخام (Raw Mode) —— مثل يد التحكم
- هذا وضع "المحترفين".
- السلوك: كل مفتاح تضغطه (بما فيها مفاتيح الأسهم و Ctrl) يتم إرساله فوراً للبرنامج، بدون أي تخزين مؤقت.
- الميزة: البرنامج يستجيب لأفعالك في الوقت الفعلي.
- سيناريو الاستخدام: ألعاب الطرفية (مثل لعبة الثعبان)، استخدام محرر Vim (محرر يعمل بلوحة المفاتيح فقط).
انقر على الأزرار أدناه للتبديل بين الوضعين، وتجربة الفرق بين "كتابة رسالة" و"لعب لعبة":
7. التحكم في العمليات: الإشارات (Signals)
في الطرفية، الضغط على Ctrl+C عادة يوقف البرنامج. هذا لا يتم بإرسال حرف، بل بتفعيل إشارة (Signal).
الإشارات هي آلية إشعار على مستوى نظام التشغيل، تخبر البرنامج بحدوث حدث معين.
- Ctrl+C → يرسل
SIGINT(Interrupt): يخطر البرنامج "يرجى مقاطعة العملية الحالية". - Ctrl+Z → يرسل
SIGTSTP(Suspend): يخطر البرنامج "يرجى التعليق والانتقال للخلفية".
هذه الآلية تتجاوز قناة إدخال البيانات القياسية، مما يضمن بقاء السيطرة للمستخدم حتى عندما يتجمد البرنامج.
Sends SIGINT (signal interrupt) to the foreground process. Most programs respond by stopping immediately. It's how you cancel a long-running command or exit a program that's stuck.
Click "Run Command" to start a simulated process, then try sending different signals.
8. تطبيقات متقدمة: واجهة ملء الشاشة والمخازن المؤقتة (Buffers & TUI)
هل لاحظت أنك عند استخدام vim لتحرير ملف أو htop لعرض حالة النظام، يشغلان الشاشة بالكامل؟ وعند الخروج منهما، تعود الشاشة فوراً لحالتها السابقة مع بقاء سجل الأوامر كما هو.
هذا لأن الطرفية تمتلك "لوحتي رسم" تتبادلان الأدوار:
المخزن المؤقت الرئيسي (Primary Buffer): مثل دفتر المسودات.
- تكتب سطراً، النظام يرد بسطر.
- عندما تمتلئ، تقلب الصفحة (التمرير)، وما كتبته سابقاً يبقى أعلاه.
- الاستخدام: كتابة الأوامر اليومية.
المخزن المؤقت البديل (Alternate Buffer): مثل السبورة.
- البرنامج يمسح السبورة ويرسم عليها (عرض ملء الشاشة).
- مهما رسم، لن يؤثر على دفتر المسودات على طاولتك.
- عند خروجك من البرنامج، وكأنك أزحت السبورة وعدت أمام دفتر المسودات.
- الاستخدام: Vim, Nano, الألعاب وغيرها من برامج ملء الشاشة.
انقر على الزر أدناه لتجربة كيف يتبادل "دفتر المسودات" و"السبورة" الأدوار في لحظة:
Current: Primary Buffer (Primary Buffer)
This is the standard scrolling log. Commands are executed line by line.
9. الملخص (Summary)
الطرفية ليست صندوقاً أسود غامضاً، بل هي واجهة تفاعل نصية موحدة.
- العرض: مبني على الشبكات والأحرف.
- التحكم: مبني على تسلسلات الهروب.
- التفاعل: مبني على تدفقات الإدخال/الإخراج والإشارات.
من خلال فهم هذه المبادئ الأساسية، لن تكتفي بحفظ الأوامر، بل ستفهم حقاً المنطق الكامن وراء كل ضغطة مفتاح.
الملحق: مسرد المصطلحات (Vocabulary)
| المصطلح | الإنجليزية | الشرح |
|---|---|---|
| الطرفية | Terminal | برنامج النافذة المسؤول عن العرض والإدخال (الواجهة الأمامية). |
| Shell | Shell | البرنامج المسؤول عن تحليل الأوامر وتنفيذ المنطق (الواجهة الخلفية). |
| CLI | Command Line Interface | واجهة سطر الأوامر، طريقة تفاعل قائمة على النص. |
| TUI | Text User Interface | واجهة مستخدم نصية، تشير إلى واجهة رسومية وهمية مبنية بأحرف في الطرفية. |
| تسلسل الهروب | Escape Sequence | تعليمات أحرف خاصة للتحكم في مؤشر الطرفية، الألوان، إلخ. |
| الإدخال/الإخراج القياسي | Stdin/Stdout | القنوات القياسية التي يستقبل ويرسل عبرها البرنامج البيانات. |
المراجع (Reference)
- How Terminals Work: استلهمت بنية هذا المقال وعروضه التوضيحية بعمق من هذا المشروع. إذا كنت ترغب في التعمق أكثر في تفاصيل التنفيذ الهندسي، نوصي بشدة بقراءة النسخة الأصلية.