أساسيات الطرفية والشل
أساسيات الطرفية والشل
كل خادم ستديره في الإنتاج يعمل بنظام Linux ويقبل الأوامر من خلال الطرفية. لا توجد واجهات رسومية، ولا قوائم نقر يمين، ولا سحب وإفلات. الطرفية هي الواجهة — وإتقانها هو المهارة الأعلى تأثيراً يمكن لمهندس DevOps تطويرها. قبل أن تتنقل في أنظمة الملفات أو تكتب pipelines، عليك أن تفهم ما الذي تتحدث إليه حقاً حين تفتح تلك النافذة السوداء.
الطرفية والشل والكونسول — ما الفرق؟
تُستخدم هذه الكلمات الثلاث بالتبادل في الحديث العام لكنها تعني أشياء مختلفة:
- الطرفية (محاكي الطرفية): برنامج يرسم نافذة ويعالج إدخال لوحة المفاتيح ويعرض النص. أمثلة:
gnome-terminal،iTerm2،Windows Terminal،alacritty. على خادم بعيد تتصل عبرssh، وجلسة SSH نفسها تعمل كطرفية. - الشل: البرنامج الذي يعمل داخل الطرفية. يقرأ أوامرك ويفسّرها ويمررها إلى النواة. الشل هو المفسّر اللغوي — له متغيرات وحلقات ودوال وشروط. الشلات الشائعة:
bash(الافتراضي في Linux)،zsh(الافتراضي في macOS منذ Catalina)،sh(شل POSIX متوافق وبسيط)،fish(الشل التفاعلي الودود)،dash(خفيف للغاية، كثيراً ما يكون/bin/shفي Ubuntu). - الكونسول: في الأصل كانت شاشة النص ولوحة المفاتيح المتصلة مباشرة بالخادم. في الاستخدام الحديث يعني عادةً الطرفية التي تحصل عليها عند تسجيل الدخول محلياً، أو الكونسول التسلسلي للمزود السحابي الذي تستخدمه حين يتعطل SSH.
#!/bin/bash أو #!/bin/sh، تختار المفسّر — تماماً كاختيار Python 3 مقابل Python 2 بـ #!/usr/bin/env python3. سطر shebang مهم في الإنتاج لأن dash (في الغالب هو /bin/sh في Ubuntu) لا يدعم بنية Bash الخاصة مثل [[ أو local -n. استخدم دائماً #!/usr/bin/env bash في السكريبتات التي تحتاج ميزات Bash.قراءة موجّه الشل (Prompt)
حين تفتح طرفية، يعرض الشل موجّهاً (prompt) — سلسلة قصيرة تخبرك أين أنت ومن أنت قبل انتظار الإدخال. فك شيفرته فوراً يوفّر الارتباك:
hostname وwhoami قبل تنفيذ أي شيء لا يمكن التراجع عنه. بعض الفرق تلوّن موجّه الشل باللون الأحمر للخوادم الإنتاجية — إشارة بصرية تجبرك على التوقف والتفكير.تشريح الأمر
كل أمر شل يتبع بنية متسقة. فهم هذه البنية يتيح لك قراءة أي أمر تصادفه، حتى لو لم تره من قبل:
تحليل المثال: ls -lh --sort=size /var/log 2>&1 | head -20
ls— الأمر (سرد محتويات المجلد)-lh— أعلام قصيرة مجمّعة:-l(تنسيق مفصّل) و-h(أحجام مقروءة للإنسان)--sort=size— خيار طويل بقيمة: الترتيب حسب حجم الملف/var/log— الوسيط: المجلد المراد سرده2>&1— إعادة توجيه stderr (واصف الملف 2) إلى stdout (واصف الملف 1) حتى تظهر الأخطاء في الأنبوب| head -20— تمرير الإخراج إلىhead، عرض أول 20 سطراً فقط
الحصول على المساعدة: man و --help وما هو أبعد
في شركات التقنية الكبرى، يعمل المهندسون بشكل اعتيادي مع أوامر لم يحفظوها. القدرة على إيجاد إجابات موثوقة بسرعة أكثر قيمة من حفظ الأعلام. يوفّر Linux عدة طبقات من التوثيق:
command -v بدلاً من which للتحقق من وجود برنامج. which ليس POSIX-standard ويتصرف بشكل متقلب عبر التوزيعات — في بعض الأنظمة يُرجع 0 حتى حين لا يوجد الأمر. الصيغة الصحيحة: if ! command -v docker >/dev/null 2>&1; then echo "docker not found"; exit 1; fiأنواع الشل: التفاعلي مقابل غير التفاعلي، الدخول مقابل غيره
هذا الفرق يُوقع كل مهندس DevOps مرة على الأقل في الإنتاج. سلوك الشل — أي ملفات التهيئة يقرأها — يعتمد على طريقة تشغيله:
- شل الدخول (Login shell): يبدأ عند تسجيل الدخول (SSH،
su -،sudo -i). يقرأ/etc/profile، ثم~/.bash_profile(أو~/.profile). متغيراتPATHوJAVA_HOMEوغيرها تُحمَّل هنا. - شل تفاعلي غير دخول: تبويب طرفية جديد، أو
bashبدون-l. يقرأ~/.bashrc. الأسماء المستعارة وتخصيص الـ prompt تعيش هنا. - شل غير تفاعلي: سكريبت شل يعمل في CI pipeline، أو مهمة cron، أو
ssh host "command". يقرأ تقريباً لا شيء — لا.bashrc، لا أسماء مستعارة. هذا سبب فشل سكريبت يعمل محلياً في CI:/usr/local/binفيPATHتفاعلي لكن ليس فيPATHالسكريبت.
سجل الشل واختصارات لوحة المفاتيح
السرعة الإنتاجية تأتي من عدم إعادة الكتابة. هذه الاختصارات ذاكرة عضلية للمهندسين ذوي الخبرة:
Ctrl+R— بحث عكسي في السجل؛ اكتب جزءاً من أمر لإيجادهCtrl+A/Ctrl+E— الانتقال إلى بداية / نهاية السطرCtrl+W— حذف كلمة واحدة إلى الخلفCtrl+L— مسح الشاشة (مثلclear)!!— تكرار الأمر الأخير (الاستخدام الكلاسيكي:sudo !!بعد نسيان sudo)!$— آخر وسيط في الأمر السابق:mkdir /opt/myapp && cd !$Alt+.— إدراج آخر وسيط من الأمر السابق (مثل!$لكن تفاعلي)Ctrl+C— إرسال SIGINT للعملية الأمامية (مقاطعة)Ctrl+Z— إيقاف مؤقت للعملية الأمامية (ثمfgللاستئناف،bgللخلفية)Ctrl+D— إرسال EOF؛ يغلق الشل الحالي إن كان الموجّه فارغاً
~/.bash_history (افتراضياً 500-2000 سطر). في بيئات الإنتاج، كثيراً ما يُضبط HISTSIZE على رقم أكبر بكثير (50,000+) ويُهيَّأ HISTTIMEFORMAT ليُختم كل أمر بطابع زمني — أمر حرج في التحقيقات التي تسأل "ماذا نفّذ المهندس بالضبط ومتى؟"ما يفعله الشل بمدخلاتك
فهم ترتيب توسيع الشل يمنع أخطاء خفية في السكريبتات ويمنع حقن الأوامر العرضي في CI pipelines:
- التقطيع إلى رموز: تقسيم الإدخال على المسافات البيضاء (ما لم تكن محاطة بعلامات اقتباس)
- توسيع الأقواس:
{a,b,c}←a b c - توسيع التيلدة:
~←/home/edrees - توسيع المتغيرات:
$VAR← قيمتها - استبدال الأوامر:
$(command)← إخراجها - التوسيع الحسابي:
$((1 + 2))←3 - تقسيم الكلمات: تقسيم نتيجة التوسيع على
IFS(افتراضياً: مسافة، تاب، سطر جديد) - توسيع المسار (globbing):
*.log← أسماء الملفات المطابقة - إزالة علامات الاقتباس: إزالة علامات الاقتباس التي جرى معالجتها
"$VAR" لا $VAR. بدون علامات الاقتباس، متغير يحتوي مسافات ينقسم إلى وسيطات متعددة كاسراً الأوامر بصمت. هذا مصدر فشل سكريبتات إنتاج لا تُحصى: rm -rf $DEPLOY_DIR مع DEPLOY_DIR="" يتوسع إلى rm -rf محذوفاً شجرة المجلد الحالي.