المحتوى عن 'طرفية'.



مزيد من الخيارات

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المُحتوى


التصنيفات

  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • نصائح وإرشادات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • التجارة الإلكترونية
  • الإدارة والقيادة
  • مقالات ريادة أعمال عامة

التصنيفات

  • PHP
    • Laravel
    • ووردبريس
  • جافاسكريبت
    • Node.js
    • jQuery
    • AngularJS
    • Cordova
  • HTML
    • HTML5
  • CSS
  • SQL
  • سي شارب #C
    • منصة Xamarin
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • Sass
    • إطار عمل Bootstrap
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • برمجة أندرويد
  • لغة Swift
  • لغة R
  • لغة TypeScript
  • ASP.NET
    • ASP.NET Core
  • سير العمل
    • Git
  • صناعة الألعاب
    • Unity3D
  • مقالات برمجة عامة

التصنيفات

  • تجربة المستخدم
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
    • كوريل درو
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • خواديم
    • الويب HTTP
    • قواعد البيانات
    • البريد الإلكتروني
    • DNS
    • Samba
  • الحوسبة السّحابية
    • Docker
  • إدارة الإعدادات والنّشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • مقالات DevOps عامة

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • التسويق بالرسائل النصية القصيرة
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح

التصنيفات

  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • مقالات عمل حر عامة

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
  • أندرويد
  • iOS
  • macOS
  • ويندوز

التصنيفات

  • شهادات سيسكو
    • CCNA
  • شهادات مايكروسوفت
  • شهادات Amazon Web Services
  • شهادات ريدهات
    • RHCSA
  • شهادات CompTIA
  • مقالات عامة

أسئلة وأجوبة

  • الأقسام
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة البرمجة
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات
    • أسئلة الشهادات المتخصصة

التصنيفات

  • ريادة الأعمال
  • العمل الحر
  • التسويق والمبيعات
  • البرمجة
  • التصميم
  • DevOps

تمّ العثور على 7 نتائج

  1. يعالج هذا الدرس، الأول من سلسلة دروس عن شهادة RHCSA، أساسيّات التعامل مع الطرفيّة Terminal في RHEL. سنفترض أن لديك توزيعة RHEL 7 مثبّتة وجاهزة للعمل؛ يمكنك الاستعانة بدرس تثبيت Red Hat Enterprise Linux باستخدام VirtualBox لتجهيز بيئة للعمل عليها. بنية الأوامر في Shell لا تثبّت -عادةً- واجهة رسومية في الخواديم؛ لذا ستجد نفسك في الغالب أمام واجهة نصيّة تمثّلها الصّدفة Shell التي تقدّم محثّا Prompt ينتظر منك إدخال أوامر تتفاعل عن طريقها مع مختلف خدمات نظام التّشغيل. بالنسبة للخواديم بواجهة رسوميّة فيمكن تشغيل برنامج الطرفيّة Terminal وستظهر نافذة بمحثّ تُكتَب فيه الأوامر. يُنفَّذ الأمر في الطرفيّة بالضّغط على زرّ Enter في لوحة المفاتيح، ويتكوّن من جزأين: اسم الأمر ومعطيات Arguments. تُغيّر معطياتٌ (تُسمّى خيارات Options، وتكون مسبوقة عادة بشرطة -) سلوكَ الأمر على نحوّ محدَّد سلفا؛ بينما تعيّن المعطيات الأخرى الكائنات التي سيعمل عليها الأمر. ملحوظة: برنامج الصّدفة المبدئي Default في RHEL وكثير من توزيعات لينكس هو Bash (اختصار لـBourne again shell). توجد برامج أخرى للصّدفة يمكن تثبيتها مثل C Shell و Ksh. الحصول على معلومات عن الأوامر توجد وسائل عدّة يمكن من خلالها الحصول على معلومات مفصَّلة عن أوامر الصّدفة. الأوامر المضمنة Built-in والأوامر المنفصلة تنقسم الأوامر في الصّدفة إلى نوعين؛ أوامر مضمَّنة وأخرى مستقلة أو منفصلة. تعدّ الأولى جزءًا من الصّدفة نفسها أمّا الثانيّة فهي برامج تُثبَّت على النظام إما مبدئيًّا أو يُثبّتها المستخدم. يساعد الأمر type في تحديد ما إذا كان أمر مّا مضمَّنا في الصّدفة أو أن حزمة (برنامجا) آخر منفصلة عن الصّدفة توفّره. يمكّننا هذا الفصل بين طبيعة الأوامر أن نعرف أين يمكننا الحصول على معلومات أكثر عن أمر عندما نحتاج لذلك. إن كان الأمر مضمّنا في الصّدفة فسنبحث عن معلوماته في صفحة التوثيق الخاصّة بها؛ أما إذا كان منفصلا عنها فسنبحث عن المعلومات عنه في صفحة التوثيق الخاصّة بالبرنامج الذي يوفّره. $ type cd cd is a shell builtin $ type top top is /usr/bin/top $ type type type is a shell builtin $ type less less is /usr/bin/less ملحوظة: تشير علامة الدولار $ إلى محثّ المستخدم العادي، وليست جزءا من الأمر. السّطر أو الأسطر الموالية للسّطر الذي توجد به علامة الدولار هو نتيجة تنفيذ الأمر. في الأمثلة أعلاه ننفّذ الأمر type ونمرّر له اسم الأمر الذي نريد معرفة هل هو مضمَّن في الصّدفة أم منفصل عنها. تظهر بعد تنفيذ كل أمر نتيجة؛ تشير النتيجة: cd is a shell builtin إلى أن الأمر cd مضمَّن في الصّدفة؛ نفس الشيء ينطبق على type. إن لم يكن الأمر مضمّنا في الصّدفة، بمعنى أن حزمةً منفصلةً توفّره، فسيظهر مسار الحزمة كما هو الحال مع أمرَي top وless في الأمثلة السّابقة. من بين الأوامر المعروفة المضّمنة في الصّدفة: أمر echo الذي يطبع سلسلة محارف. أمر pwd الذي يطبع مسار المجلّد الحالي. توثيق الأوامر يمكننا الاستعانة بصفحات التوثيق عند الشّك في عمل أمر مّا. تُستدعى صفحات التوثيق بالأمر man. توجد إضافة إلى صفحات توثيق الأوامر صفحاتُ توثيق خاصّة بالملفّات المهمّة مثل hosts ،fstab و inittab؛ دوال المكتبات البرمجيّة، الصّدفات، الأجهزة الطّرفية وميزات أخرى. نستخدم الأمر man مثلا على النحو التالي لعرض معلومات عن عمل الأمر uname: $ man uname في ما يلي مقتطَف من النتيجة: UNAME(1) User Commands UNAME(1) NAME uname - print system information SYNOPSIS uname [OPTION]... DESCRIPTION Print certain system information. With no OPTION, same as -s يوجد مصدر آخر مهمّ للبحث عن معلومات أمر مّا وهو أمر info الذي يقدّم عادة معلومات أشمل من أمر man. يُمرَّر اسم الأمر الذي نريد معلومات عنه إلى info على النّحو التالي: $ info ls $ info cut كما تتوفّر ملفّات مساعدة في المجلّدات الفرعيّة للمجلّد usr/share/doc/. حاول التعوّد على استخدام الطّرق الثلاث المذكورة أعلاه للبحث عن معلومات حول أمر تريد استخدامه أو تشّك في معطياته. انتبه خصوصا للمعلومات المذكورة عن صيغة استخدام كلّ أمر. أوامر أساسية أمر exec ينفّذ أمرُ exec الأمرَ الممرّر في المعطى. في الغالب يمكن تنفيذ الأمر الأخير دون الحاجة لتمريره إلى exec إلا أنّ خصوصيّة exec هي أنها تنشئ عمليّة Process جديدة تحلّ مكان عمليّة الصّدفة بدلا من العمل بالتوازي معها. عندما تنتهي العمليّة الجديدة تنتهي معها عمليّة الصّدفة. نقارن بين الحالتي التاليتيْن لتوضيح المسألة: $ top $ exec top ننفّذ في الحالة الأولى أمر top الذي يعرض قائمة بالعمليّات العاملة على النظام؛ ثم نضغط الزّر q لإنهاء الأمر؛ ستلاحظ أن المحثّ يظهر من جديد. في الحالة الثّانيّة يُنفَّذ الأمر top وتظهر قائمة بالعمليّات؛ ولكن عند الضّغط على زر q تختفي الطرفيّة. أمر export يُستخدَم أمر export لـ”تصدير” متغيّر إلى متغيّرات النّظام. متغيّرات النّظام (أو متغيّرات البيئة Environment variables) هي مجموعة من المتغيّرات تؤثّر قيّمها على سلوك البرامج أثناء تنفيذها؛ بعضها معدّ مبدئيًّا مع النّظام ويُتاح الوصول إليه لجميع البرامج. لكي يُضاف متغيّر إلى هذه المتغيّرات فيجب أن يُصدَّر إليها؛ وهذا هو عمل الأمر export. راجع السؤال التالي من قسم الأسئلة والأجوبة ماذا يعني متغير النظام PATH؟ أو درس الطريق نحو فهم متغير المسار PATH لمعلومات أكثر ومثال على متغيّرات النّظام. أمر history يعرض الأمرُ لائحة بالأوامر التي نفّذها الحساب الذي تستخدمه على النظام، مع ترقيمها. تمكن إعادة تنفيذ الأمر بكتابة رقمه في اللائحة مسبوقا بعلامة تعجّب. مثلا: $ history 13 tty 14 exec top 15 ps -ef | grep bash 16 ps -ef | grep 3817 | grep -v grep 17 ps -ef | grep bash 18 tty 19 exec top 20 ps -ef | grep bash 21 ps -ef | grep 4692 22 ps -ef | grep 4692 | grep -v 23 ps -ef | grep 4692 | grep -v grep 24 exit 25 history لإعادة تنفيذ الأمر رقم 19 (أي exec top): !19 يمكننا أيضا البحثُ في سجلّ الأوامر بالضّّغط على الزّريْن Ctrl وr ثم البدء في كتابة الأمر الذي نبحث عنه وستظهر الأوامر الموافقة لما نكتب مباشرة مع إمكانيّة التعديل عليها. يُحتَفَظ بلائحة الأوامر في ملف باسم bash_history. يوجد بالمجلَّد الشخصيّ للمستخدِم. تحتفظ الصّدفة مبدئيًّا بآخر 1000 أمر نفّذها المستخدم؛ إلا أن بإمكانك تغيير هذه القيمة بالتعديل على قيمة متغيّر النّظام Environment variable الذي يحتفظ بهذه القيمة وهو HISTSIZE. يمكن استخدام أمر export لتعديل قيمة المتغيّر. نستخدم في المثال التالي أمر echo لعرض قيمة المتغيّر قبل التعديل ثم نعدّله ونطبع قيمته الجديدة (لاحظ استخدام علامة $ قبل اسم المتغير عند تمريره للأمر echo): $ echo $HISTSIZE 1000 $ export HISTSIZE=2000 $ echo $HISTSIZE 2000 إلا أن طريقة التغيير هذه ليست دائمة؛ إذ سيعيد النّظام قيمة HISTSIZE المبدئية إذا أعيد تشغيله أو عند الخروج من الطرفيّة. لجعل التّعديل دائما نعدّل الملف bashrc. يدويًّا ونعيّن قيمة المتغيّر HISTSIZE (لا تترك فراغا بين علامة = وطرفيّ العمليّة): HISTSIZE=2000 ملحوظة: لن يُعتمَد هذا التعديل إلا عند فتح جلسة جديدة. أمر alias الاختصارات Aliases هي صيغ مختصرة لأمر أطول. إن كانت ملفّات موقع الويب توجد على المسار /var/www/ ونستخدم أمر cd للانتقال إليها على النحو التالي: cd /var/www فيمكننا تعريف كنية (اختصار) www تعمل كما لو أنها أمر ويؤدي تنفيذها إلى الانتقال إلى المجلّد المذكور. يعرض الأمر alias إن نُفِّذ دون معطيات، أو بتمرير المعطى p-، لائحة بالاختصارات المضبوطة. إن أردت إعداد اختصار جديد فيمكنك ذلك بذكر اسم الاختصار ثم الأمر الذي تحلّ محله على النحو التالي: $ alias ls='ls --color=auto' يغيّر الاختصار السّابقة عمل الأمر ls بإضافة معطيات نريد أن تعمل مبدئيًّا؛ إظهار كلّ نوع من الملفات بلون مختلف عند تنفيذ أمر ls. ملحوظة: يمكنك إعطاء أي اسم تريده للاختصار؛ حتى ولو كان اسم أمر موجود سلفا؛ لذا ينبغي الحذر في اختيار أسماء الاختصاصرات. كما يمكنك أيضا إدراج أكثر من أمر في الاختصار على أن تفصل بينها بنقطة فاصلة ;: $ alias myNewCommand='cd /usr/bin; ls; cd; clear' يعمل الأمر alias على تعديل الاختصارات بالنسبة للجلسة الحاليّة دون أن تكون التغييرات دائمة. لجعل الاختصارات تعمل بعد إعادة تشغيل النّظام أو بعد الخروج من الجلسة الحاليّة أضفها إلى الملف bashrc. الموجود في ملفك الشّخصي؛ إختصار واحد في كلّ سطر (في آخر الملفّ، تحت سطر User specific aliases and functions #)؛ مثلا: alias myNewCommand='cd /usr/bin; ls; cd; clear' ستُعتمَد التعديلات بعد الخروج من الجلسة الحاليّة. إن أردت أمثلة أكثر تفصيلا عن الاختصارات فدرس مقدّمة إلى اختصارات الطرفية (Aliases) ودوالها - أنجز مهامك بسرعة! يقدّمها. أمر exit ينهي كلّ من أمري exit وlogout جلسة الصّدفة. الفرق بين الاثنين أن أمر exit ينهي أي صدفة مهما كان نوعها بينما ينهي أمر logout صدفات تسجيل الدّخول؛ وهي تلك المشغَّلة تلقائيًّا عند تسجيل الدّخول من الواجهة النصيّة (الواجهة غير الرّسوميّة). ملحوظة: الصّدفة Shell هي اسم عامّ لأي برنامج يعطيك واجهة نصيّة للتّفاعل مع النّظام. توجد أنواع عدّة من الصّدفات؛ التفاعليّة Interactive، غير التّفاعليّة، صدفات تسجيل الدّخول Login وصدفات ما بعد الدخول Non-login. صدفات تسجيل الدّخول هي جزء من عمليّة الدّخول إلى النّظام (مثلا في خادوم ليست لديه واجهة رسوميّة)؛ أما صدفات ما بعد الدخول فيشّغلها المستخدم بعد ولوجه إلى النّظام؛ ومن أمثلتها برنامج Terminal في الواجهة الرّسومية. جرّب تنفيذ الأمر logout في برنامج الطرفيّة في الواجهة الرسوميّة ولاحظ الرسالة التي تظهر. أمر expand لا تتعامل بعض البرامج المعالجة النصيّة جيّدا مع علامة الجدولة Tabulation وتحتاج بالتالي إلى استبدال المسافة بها. يؤدّي أمر expand، الذي يأتي ضمن حزمة برامج coreutils، هذه المهمة. سنفترض أن لدينا ملفًّا باسم numbers (امتداد الملفات ليس ذا أهميّة كبيرة في لينكس) به أرقام تفصل بينها علامات جدولة. نستخدم أمر cat لعرض محتوى الملفّ في الطّرفيّة: $ cat numbers one two three four five six seven eight nine ten twelve thirteen نضع مسافات مكان علامات الجدولة كالتالي: $ expand --tabs=1 numbers يحدّد المعطى tabs-- عدد المسافات التي نضعها مكان الجدولة (مسافة واحدة في المثال). تظهر النتيجة على النحو التالي: one two three four five six seven eight nine ten twelve thirteen لاحظ أن التغييرات لا تحدُث على الملفّ، بل تُطبع مباشرة في الطّرفيّة (التي تُعرَف بـالإدخال المعياري Standard input, stdin). إن رغبت في الإجراء المعاكس لعمل expand (بمعني إحلال علامات جدولة مكان المسافات) فأمر unexpand موجود لهذا الغرض ويُستعمَل بنفس المبدأ. أمرا head و tail يطبع أمر head، إن استُخدِم دون خيارات، الأسطرَ العشرة الأولى من الملفّ المذكور اسمُه في المعطى. يمكن تغيير هذا السلوك المبدئيّ باستخدام خيّار n- متبوعا برقم يمثّل عدد الأسطر التي تود إظهارها: $ head -n3 /etc/passwd يعمل أمر tail بطريقة مشابهة لكنّه بدلا من طباعة الأسطر الأولى يطبَع الأسطر الأخيرة. $ tail -n3 /etc/passwd يوفّر أمر tail باستخدام خيّار f- ميزةَ عرض الأسطر الأخيرة من ملف فور إضافتها إليه. يمكن استخدام هذه الميزة مثلا لمتابعة سجلّ Log في الوقت الحقيقيّ: $ tail -f file.log أمر paste يأخذ أمر paste ملفيّن نصّييْن بمحاذاة أسطُر الملفّ الأول منهما بجانب الثاني ووضع فاصل بين السّطريْن. إن استُخدِم الأمر دون تحديد الفاصل فسيُستخدَم الفاصل المبدئي (علامة الجدولة). إن أردت تخصيص الفاصل فيمكن استخدام الخيّار d-. يطبع الأمر النتيجة مباشرة في الطّرفيّة دون تعديل على أي من الملفّيْن. في المثال التالي نُظهِر محتوى الملفّيْن file1 و file2 بالأمر cat ثم نستخدم paste لدمج الاثنيْن: $ cat file1 1 2 3 4 $ cat file 2 one two three four $ paste -d= file1 file2 1=one 2=two 3=three 4=four 5=five 6=six استخدمنا في المثال السّابق الخيار d- لتحديد الفاصل؛ وهو في هذه الحالة علامة التساوي =. لاحظ ألا وجود لمسافة بين الخيار d- والعلامة التي اخترناها للفصل بين سطريْ الملفّين؛ كما أن أسطُر الملفّ في المعطى الأول تأتي أولا تليها علامة الفصل ثم أسطر الملف الثاني. أمر split يعمل الأمر split على تقسيم ملفّ إلى ملفّيْن أو أكثر وتسميّتهما اعتمادا على لاحقة Suffix من اختيارنا. لدينا معايير تقسيم عدّة للاختيّار بينها؛ الحجم Size، عدد الأسطُر، عدد الملفات الناتجة وطبيعتها. بالنسبة للّاحقة فيمكن أن تكون أحرفا أو أرقاما. يقسّم الأمر التالي الملف bash.pdf إلى ملفّات حجمُ كلّ واحد منها 50KB. تبدأ الملفّات الناتجة بـ_bash يليها عدد. $ split -b 50KB -d bash.pdf bash_ الخيّار b- يحدّد معيار التقسيم بحجم 50KB؛ الخيّار d- يحدّد نوعيّة اللّاحقة (أعداد مرتَّبة)، bash.pdf اسم الملفّ الذي نريد تقسيمه و_bash السّابقة التي تبدأ بها أسماء الملفّات المتحصَّل عليها. مثال على النتجية: bash_00 bash_01 bash_02 bash_03 bash_04 bash_05 لو لم نستخدم الخيّار d- لكانت النتيجة كالتالي: bash_aa bash_ab bash_ac bash_ad bash_ae bash_af إن أردت دمج الملفّات الناتجة والحصول على الملفّ الأصلي فأمر cat يفي بالغرض: $ cat bash_00 bash_01 bash_02 bash_03 bash_04 bash_05 > bash.pdf أمر tr يُستخدَم أمر tr لإحلال محارف Characters مكان أخرى. نستخدم في المثال التالي ملف file2 السابق وننفذ عليه أمر tr لإحلال O مكان o : $ cat file2 | tr o O يُستخدَم الأنبوب Pipe (|) لتوجيه نتيجة أمر إلى آخر؛ تُصبِح نتيجة الأمر اﻷول في هذه الحالة هي معطى الأمر الثاني. في المثال نطبع محتوى الملف file2 ثم نمرّره للأمر tr؛ تظهر النتيجة في الطرفيّة: One twO three fOur five six يمكن تطبيق التحويل على مجال من الأحرف؛ في المثال التالي نُحوِّل جميع الأحرف الصّغيرة في الملف file2 إلى أحرف كبيرة: $ cat file2 | tr [a-z] [A-Z] ONE TWO THREE FOUR FIVE SIX أمرا sort و uniq يتيح أمر uniq إمكانيّة إظهار الأسطر المكرّرة في ملف نصّي أو حذفها. يجب الانتباه إلى أن uniq لا يكشف التكرار إلا إذا كانت الأسطُر المتكرّرة متتالية. لذا فإن تنفيذ uniq يسبقه غالبا ترتيب الملفّ بالأمر sort. يفترض أمر sort مبدئيّا أن السّطر يتكوّن من حقول عدّة تفصل بينها مسافات؛ ويعتمد الحقل الأول لترتيب أسطُر الملف. لاحظ المثال التالي وكيف حذف أمر uniq أحد الأسطر بعد ترتيب الملفّ بـ sort: $ cat file3 Jan Doe 111 Dave Null 114 Peter Cramp 113 Dave Smith 112 Dave Null 114 $ sort file3 | uniq Dave Null 114 Dave Smith 112 Jan Doe 111 Peter Cramp 113 يمكّننا خيار k- متبوعا برقم يمثّل موقع الحقل في السّطر (الثاني، الثالث، …) من اختيّار حقل مغاير للحقل المبدئي في ترتيب الملف. لاحظ الترتيب في المثالين: $ sort -k2 file3 | uniq Peter Cramp 113 Jan Doe 111 Dave Null 114 Dave Smith 112 $ sort -k3 file3 | uniqJan Doe 111 Dave Smith 112 Peter Cramp 113 Dave Null 114 يتيح أمر sort كذلك حذف الأسطُر المكرّرة مباشرة دون الحاجة لتمرير نتيجة الترتيب إلى uniq وذلك باستخدام الخيّار u-: $ sort -u file3 Dave Null 114 Dave Smith 112 Jan Doe 111 Peter Cramp 113 أمر cut يستخرج أمر cut أجزاءً من أسطر ويعرضها في الطّرفيّة. يعتمد الأمر على عدد البايتات (الخيار b-)، المحارف (c-) أو الحقول (f-). يتّخذ أمر cut مبدئيا المسافة فاصلا بين الحقول؛ إلا أن بالإمكان تخصيص الفاصل بالخيّار d-. نستخدم في المثال التالي أمر cut لاستخراج الحقليْن الأول والثالث من الملف etc/passwd/ اعتمادا على أنه يُفصَل بين الحقول بعلامة :. cut -d: -f1,3 /etc/passwd يحدّد d- الفاصل بين الحقول (:)، و f- الحقول التي نستبقيها (الحقل الأول والثالث). خاتمة رأينا في هذا الدّرس أساسيّات التعامل مع الطّرفيّة، كيفيةَ الحصول على المساعدة عندما نحتاج إليها وأوامرَ هامّة لمعالجة الملفات النّصيّة من سطر الأوامر. استخدم وسائل المساعدة التي تحدثنا عنها للحصول على معلومات أكثر عن الأوامر الواردة في المقال. يمكنك استخدام مربع التعليقات في الأسفل لطرح استشكالات عن موضوع الدّرس. ترجمة -وبتصرّف- للمقال RHCSA Series: Reviewing Essential Commands & System Documentation لصاحبه Gabriel Cánepa.
  2. قدرات إعادة التوجيه (redirection) في لينكس توفّر لك العديد من الأدوات القوية التي يُمكن استخدامها لجعل جميع أنواع المهام أسهل للتنفيذ. سواءٌ كنتَ تكتبُ برمجياتٍ معقّدة أو كنتَ تقوم بإدارة الملفّات عبر سطر الأوامر، فإنّ معرفة كيفية التلاعب بتدفّقات (streams) الإدخال/الإخراج (input/output) على بيئتك الشخصية سيزيدُ من إنتاجيّتك بشكلٍ ملحوظ. التدفقات يتم توزيع الإدخال والإخراج في بيئة لينكس عبر ثلاث تدفّقات (streams) أساسية: إدخال معياري (stdin). إخراج معياري (stdout). خطأ معياري (stderr). هذه التدفّقات أيضًا مرقّمة وفق التالي: (stdin (0. (stdout (1. (stderr (2. أثناء التفاعلات المعيارية (standard interactions) بين المستخدم والطرفيّة (terminal)، فإنّه يتم نقل الإدخال المعياري عبر لوحة مفاتيح المستخدم. يتم عرض الإدخال المعياري و الخطأ المعياري على طرفية المستخدم كنصّ. بشكلٍ عام، جميع هذه التدفّقات الثلاثة يتم الإشارة إليها بـ"التدفّقات المعيارية". الإدخال المعياري تدفّق الإدخال المعياري عادةً ما يحمل البيانات من المستخدم إلى البرنامج. البرامج التي تتوقع إدخالًا معيّنًا من المستخدم تستقبل الإدخال عادةً من جهازٍ ما، مثل لوحة المفاتيح، الإدخال المعياري ينتهي عند وصوله نهاية الملف (EOF – End Of File). كما يتم وصفه بواسطة اسمه، فإنّ نهاية الملف أو "EOF" تُعلِم الحاسوب أنه لا يوجد هناك المزيد من البيانات ليتم قراءتُها. لرؤية الإدخال المعياري بصورةٍ حيّةَ، شغّل برنامج cat. كلمة Cat ترمز لـ"concatenate” أو "سَلسَلة الأشياء"، والتي تعني ربط الأشياء مع بعضها البعض على شكل سلسلة. يتم استخدام Cat بشكلٍ شائع لدمج محتويات ملفّّين. عندما يتم تشغيله لوحده فإنّ cat يقوم بفتح طرفيّته الخاصّة. cat بعد فتح cat، قم بإدخال مجموعة من الأرقام كالتالي: 1 2 3 ثم اضغط Ctrl+D. عندما تقوم بكتابة رقم والضغط على زرّ Enter، فإنّك تقوم بإرسال إدخال معياري (standard input) إلى برنامج cat الذي يعمل حاليًا، والذي هو بدوره يتوقّع وصول الإدخال إليه. يقوم برنامج cat بإرسال الإدخال الذي تُدخله إليه مرةً أخرى إلى الطرفية حيث يتم عرضه كإخراج معياري (standard output). إشارة EOF (أو نهاية مدّة حياة العملية الحالية – End of File) يُمكن أن يتم إرسالها إلى البرنامج بواسطة المستخدم عبر الضغط على مفاتحيّ Ctrl+D. بعد أن يتسلّم برنامج cat إشارة EOF فإنّ البرنامج يتوقف. الإخراج المعياري يقوم الإخراج المعياري (standard output) بكتابة البيانات التي يتم إنشاءها بواسطة البرامج. عندما لا يتم إعادة توجيه تدفّق الإخراج المعياري، فإنّه سيتم إخراج النصّ إلى الطرفية. جرّب المثال التالي: echo Sent to the terminal through standard output الخطأ المعياري يقوم الخطأ المعياري (standard error) بكتابة الأخطاء التي يتم إنشاؤها بواسطة البرامج التي فشلت في أن يتم تنفيذها في مرحلةٍ ما. تمامًا مثل الإدخال المعياري فإنّ الوجهة الافتراضية لهذا التدفّق هي شاشة الطرفيّة. عندما يتم إرسال تدفّقِ خَطَأٍ معياريٍ لبرنامجٍ إلى برنامجٍ آخر، فإنّ البيانات المُرسلة (المتكوّنة من أخطاء البرنامج) يتم إرسالها بشكلٍ موازي إلى الطرفية كذلك. فلنرى مثالًا بسيطًا عن الخطأ المعياري باستخدام ls. يقوم الأمر ls بسرد محتويات المجلّدات أو المسارات. عندما يتم تنفيذه بدون أيّ معطيات، فإنَّ أمر ls يقوم بسرد محتويات المسار الحالي. إذا تمّ تشغيله مع مسارٍ معيّن كمُعطَى، فإنّه سيقوم بسرد محتويات المسار المطلوب. ls % بما أنّ % ليس مسارًا موجودًا، فإنّه سيتم إرسال النصّ التالي كخطأٍ معياري: ls: cannot access %: No such file or directory إعادة توجيه التدفق يمتلك نظام لينكس أوامرًا مُضمّنة لإعادة توجيه كلّ تدفّق. تقوم هذه الأوامر بطباعة إخراجٍ معياري إلى ملفٍّ ما. إذا تم استهداف ملفٍّ غير موجود، فإنّه سيتم إنشاء ملفٍّ جديد باسم ذاك الملفّ ليتم الكتابة عليه. الأوامر التي يأتي معها قوسٌ واحد (إشارة >) تقوم بالكتابة فوق ملفّ الوجهة الموجود. بالأسفل تجد بعض الإشارات الشائع استخدامها مع الأوامر عند التعامل معها بالطرفية لإعادة توجيه التدفّقات: 1. الكتابة فوق الملفات > إخراج معياري. < إدخال معياري. 2> خطأ معياري. 2. الإضافة إلى الملفات الأوامر التي يتم استخدامها مع قوسين اثنين لا تقوم بالكتابة فوق الملفّّات، بل تقوم بالكتابة إلى نهاية الملفّّات: >> إخراج معياري. << إدخال معياري. 2>> خطأ معياري. فلنأخذ المثال التالي: $ cat > write_to_me.txt a b c > ctrl-d يتم استخدام cat هنا لتتم عملية الكتابة إلى أحد الملفّّات، والذي يتم إنشاؤه تلقائيًا بسبب عدم وجوده ولأن الأمر الأول يحتاجه. لطباعة محتويات الملفّ write_to_me.txt باستخدام cat: $ cat write_to_me.txt يجب أن ترى أنّ الملفّ يحتوي على التالي: a b c الآن قم بإعادة توجيه cat إلى write_to_me.txt مجددًا وقم بإدخال الأرقام التالية: $ cat > write_to_me.txt 1 2 3 > ctrl-d عندما تستعمل cat لعرض محتويات write_to_me.txt، يجب أن ترى التالي: 1 2 3 أخيرًا، قم بعمل إعادة توجيه أخرى لـ cat ولكن هذه المرّة باستخدام قوسين عوضًا عن قوسٍ واحد: cat >> write_to_me.txt a b c ctrl-d وافتح ملفّ write_to_me.txt مجددًا، وسترى التالي: 1 2 3 a b c يحتوي الملفّّ الآن على النصّ من المرّة الأخيرة لاستخدام الأمر cat والتي قبلها، لأنّ الثانية لم تقم بالكتابة فوق الأولى. الأنابيب يتم استخدام الأنابيب (Pipes) لإعادة توجيه تدفّقٍ من برنامجٍ إلى آخر. عندما يتم إرسال الإخراج المعياري الخاص بأحد البرامج إلى برنامجٍ آخر عبر أنبوب (pipe) فإنّ بيانات البرنامج الأول والتي تمّ تلقّيها من طرف البرنامج الثاني سوف لن تظهر في الطرفية. فقط البيانات المُرشّحة عبر البرنامج الثاني سوف يتم عرضها. الأنبوب في نظام لينكس يتم تمثيله بإشارة شريطٍ عمودي: *|* وكمثالٍ على أمرٍ يستخدم أنبوبًا: ls | less هذا الأمر يقوم بأخذ ناتج الأمر ls (والذي يقوم بعرض محتويات المسار الحالي الذي أنت فيه) ويقوم بتمريره عبر أنبوبٍ إلى برنامج less. يقوم less بعرض البيانات المُرسلة إليه سطرًا سطرًا بدلًا من عرضها كاملة. بشكلٍ عام، يقوم ls بعرض محتويات المسار المطلوب عبر عرض الخرج بأكمله دفعةً واحدة. عندما تقوم بتشغيل ls عبر less فإنّ كلّ مُدخَلة يتم عرضها في سطرٍ واحد فقط خاصٍ بها ولا يتم عرض الخرج كله دفعةً واحدة، بل واحدة واحدة. على الرغم من أنّ وظيفة الأنابيب قد تبدو مشابهةً لإشارات الأقوس < و << (إعادة توجيه الإخراج المعياري)، فإنّ الفرق هو أنّ الأنابيب تقوم بتوجيه الخرج من أمرٍ إلى آخر، بينما تقوم إشارات الأقواس مثل < و << بتوجيه الخرج حصرًا إلى الملفّات فقط. المرشحات المرشّحات (filters) هي عبارة عن أوامر تعدّل على أنابيب إعادة التوجيه والإخراج. لاحظ أيضًا أنّه يمكن استخدام أوامر المرشّحات وأوامر لينكس العادية دون الحاجة لاستخدام الأنابيب. find: يقوم برنامج find بعرض الملفّات التي يتطابق اسمها مع المعطيات المُمررة له. grep: يقوم برنامج grep بعرض النصّ الذي يتطابق مع النصّ المُمرر إليه. tee: مهمّة برنامج tee هي إعادة توجيه الإدخال المعياري إلى كلٍ من الإخراج المعياري وملفٍّ واحد أو أكثر. tr: يقوم برنامج tr بالبحث عن سلسلة (string) واستبدالها بواحدة أخرى. wc: عدّاد للمحارف، السطور والكلمات. أمثلة قد تعرّفت الآن على إعادة التوجيه، استخدام الأنابيب والمرشّحات الأساسية، فلنلقي نظرةً على بعض أنماط إعادة التوجيه الأساسية والأمثلة. الأمر > الملف يقوم هذا النمط بإعادة توجيه ناتج أمرٍ معين إلى ملفّ، مثال: ls ~ > root_dir_contents.txt سيقوم الأمر السابق بتمرير محتويات مجلد الجذر (root directory) وكتابتها إلى ملفٍّ يدعى root_dir_contents.txt. سيقوم أيضًا بالكتابة فوق أيّ بيانات موجودة في ذاك الملفّ كوننا نستخدم قوسًا واحدًا فقط (>). الأمر > dev/null/ dev/null/ هو ملفٌّ خاص يتم استعماله لحذف أيّ بياناتٍ يتم توجيهها له. يتم استخدامه للتخلص من الخرج الذي لا نحتاجه والذي يُمكن أن يتعارض أحيانًا مع وظيفة أمرٍ آخر أو سكربت (script). يتم إهمال أي خرجٍ يتم إرساله إلى dev/null/. في المستقبل، ربّما تقوم باستخدام إعادة توجيه الخرج الناتج عن الأوامر والأخطاء إلى dev/null/ عند كتابة سكربتات الشلّ (shell scripts). ls > /dev/null سيقوم الأمر السابق بإهمال تدفّق الإخراج المعياري (standard output stream) العائد من الأمر ls عبر تمريره إلى الملفّ dev/null/ الذي سيتخلص منه. الأمر 2> الملف يقوم هذا النمط بتوجيه تدفّق الخطأ المعياري لأمرٍ ما إلى ملفّ، حيث يقوم بالكتابة فوق محتوياته الموجودة. كمثال: mkdir '' 2> mkdir_log.txt هذا الأمر سيوجّه رسالة الخطأ الصادرة عن "اسم المسار الخاطئ" ويكتبها إلى ملفّ mkdir_log.txt. لاحظ أنّه سوف يتم إرسال رسالة الخطأ أيضًا إلى الطرفية ليتمّ عرضها كنص. الأمر >> الملف يقوم هذا النمط بتوجيه ناتج أمرٍ ما إلى ملفّ دون الكتابة فوق محتويات الملفّ الحالية. مثال: echo Written to a new file > data.txt echo Appended to an existing file's contents >> data.txt هذان الأمران سيقومان أولًا بالكتابة فوق محتويات data.txt، ومن ثمّ سيتم الكتابة أسفل المحتويات الحالية لملفّ data.txt بواسطة الأمر الثاني، محتويات الملفّ يجب أن تبدو هكذا: Written to a new file Appended to an existing file's contents الأمر 2>> الملف يقوم النمط السابق بتوجيه تدفّق خطأٍ معياري لأمرٍ ما إلى ملفّ دون الكتابة فوق محتوياته الحالية. هذا النمط مفيد لإنشاء ملفّّات السجل (log files) لبرنامجٍ أو خدمة، حيث أنّه لن يتم محو محتويات الملفّ السابقة في كلِّ مرةٍ يتم الكتابة فيها إلى الملفّ. find '' 2> stderr_log.txt wc '' 2>> stderr_log.txt يوجّه الأمر أعلاه رسالة الخطأ الصادرة عن معطىٍ خاطئ للأمر find إلى ملفٍّ يُدعى stderr_log.txt. ومن ثمّ يقوم بتوجيه رسالة الخطأ الصادرة عن استخدامٍ خاطئ للأمر wc إلى نفس الملفّ. الأمر | الأمر يقوم بتوجيه خَرْجِ الأمر الأول إلى دَخْلِ الأمر الثاني. find /var lib | grep deb هذا الأمر يبحث عبر مجلّد var/ ومجلّداته الفرعية عن الملفّات والامتدادات المُطابقة للسلسلة "deb"، ويُرجِع مسارات تلك الملفّات مع تمييز الجزء المطابق من أسماء تلك بالملفّات بالسلسلة المبحوث عنها. الأمر | tee الملف هذا النمط (والذي يتضمّن أمر tee) يقوم بتوجيه ناتج أمرٍ معيّن إلى ملفّ والكتابة فوق محتوياته ومن ثمّ يقوم بعرض الناتج المُوجّه بالطرفية. حيثُ ينشئ ملفًّّا جديدًا في حال كان الملفّ غير موجود. في سياق هذا النمط، يتم استخدام الأمر tee عادةً لعرض ناتج أمرٍ معين بينما يتمّ أيضًا حفظه إلى ملفّ. كمثال: wc /etc/magic | tee magic_count.txt هذا الأمر يقوم باستخدام الأنابيب لنقل عدد المحارف، السطور والكلمات في ملفّ etc/magic/ (الذي يتم استخدامه بواسطة صدفة لينكس لتحديد نوع الملفّّات) إلى الأمر tee، والذي بدوره يقوم بفصل ناتج الأمر wc إلى اتّجاهين، ويقوم بإرساله إلى شاشة الطرفية وملفّ magic_counts.txt. بالحديث عن الأمر tee، فتخيّل الحرف T، نهاية هذا الحرف هي البيانات الكاملة، وقمّة هذا الحرف هو البيانات عندما يتم فصلها إلى اتّجاهين (الإخراج المعياري لملفٍّ ما وشاشة الطرفية). أمر | أمر | أمر >> ملف يقوم هذا النمط بتوجيه ناتج الأمر الأوّل وترشيحه عبر الأمرين الثانيين. ومن ثمَّ يقوم بطباعة الناتج إلى ملفّ. مثال: ls ~ | grep *tar | tr e E >> ls_log.txt الخاتمة تعلّم كيفية استخدام قدرات إعادة التوجيه في لينكس عند التعامل مع الأوامر قد يكون شاقًا قليلًا، ولكنك في طريقك بالفعل لاحتراف هذه المهارات بعد إكمالك لهذا الدليل. الآن وبعد أن شاهدت أساسيات كيفية عمل إعادة التوجيه والأنابيب، فستكون قادرًا على بدء رحلتك إلى عالم برمجة سكربتات الشلّ، والذي يستخدم بشكلٍ شائع غالب البرامج والأنماط المُغطّاة في هذا الدليل. إذا كنتَ تحبّ الغوص أكثر في الأوامر التي قدّمناها في هذا الدليل، فيُمكنك ذلك باستخدام الأمر man command | less. كمثال: man tee | less هذا الأمر سيُريك قائمةً كاملة بالأوامر المتوفّرة لبرنامج tee. يمكنك استخدام هذا النمط لعرض المعلومات وخيارات الاستخدام لأيّ أمرٍ أو برنامج في نظام لينكس. ترجمة -وبتصرّف- للمقال: An Introduction to Linux I/O Redirection لصاحبه David Collazo.
  3. يعدّ أمر tar من بين الأدوات التي يشيع استخدامها في سطر أوامر لينكس، إلا أن جوانب مفيدة كثيرة في الأمر تبقى مجهولة. نعرض في هذا المقال بعض أشهر استخدامات الأمر tar إضافة إلى استخدامات رائعة أخرى يقل الانتباه إليها. أول ما تجب معرفته هو الغرض الأساسي من tar؛ إذ يعمل الأمر على جمع الكثير من الملفات في واحد. إذا نفذت أمر tar على مجلّد من 37 ملفّا فستحصُل على ملفّ واحد يضمّها جميعا وبالتي يسهُل مشاركتها مع الآخرين. كما أن الأمر يحافظ على بنية المجلّد ويمكن أن يحافظ على الأذونات ومعلومات الوقت والزمن كذلك. الخيارات في ما يلي قائمة بأهم الخيارات التي يمكن استخدامها مع tar. c: إنشاء ملف أرشيف. f: استخدام مُخرج الأمر لإنشاء ملف. تظهر مخرجات الأمر في الطرفية فقط إن لم يٍُستخدَم هذا الخيار. x: استخراج محتويات ملف أرشيف. j: استخدام خوارزمية bzip2 لضغط الملفات. z: استخدام خوارزمية gzip لضغط الملفات. p: الحفاظ على الأذونات عند استخراج الملفات. t: الحصول على قائمة بمحتويات ملف الأرشيف. v: عرض تقدّم عمل الأمر أثناء تنفيذه. d: عرض الفروق بين ملف الأرشيف ونظام الملفات. إنشاء ملف أرشيف إنشاء ملف أرشيف لمجلّد: tar cf directory.tar directory إنشاء ملفّ أرشيف انطلاقا من مجموعة ملفات: tar cf directory.tar file1 file2 file3 إنشاء ملف أرشيف مضغوط بخوارزمية bzip لملفات mp3 الموجودة في المجلّد الحالي: tar -cvf mp3collection.tar ./*.mp3 إنشاء ملف أرشيف من المجلد /home/academy/ مع الحفاظ على الأذونات: tar cvpf academy.tar /home/academy/ إنشاء أرشيف من المجلد etc/ مع استبعاد المجلد الفرعيّ apache2: tar cvf etc_without_apache.tar –exclude='/etc/apache2/' ضغط الملفات إنشاء ملف مضغوط بـbzip2 مع عرض تقدّم عمل الأمر في الطرفية: tar cjvf directory.tar.bz2 directory/ إنشاء ملف مضغوط بـgzip مع عرض تقدّم عمل الأمر في الطرفية: tar czvf directory.tar.gz directory/ عرض محتوى أرشيف عرض محتوى ملف الأرشيف directory: tar tvf directory.tar.bz2 ... bluewaters_1440x900.jpg cloudyday_1440x900.jpg fragile_1600x1200.jpg coolemoticon_1440x900.jpg cloudyday_1440x900.jpg ... الاستخراج من ملفات الأرشيف استخراج محتوى ملف أرشيف: tar xvf directory.tar.bz2 استخراج ملف passwd فقط من أرشيف etc: tar xvf etc.tar.bz2 passwd استخراج مجلد postfix فقط من أرشيف etc: tar xvf etc.tar.bz2 /etc/postfix/ استخراج ملفات php فقط من أرشيف htdocs: tar xvf htdocs.tar.bz2 –wildcards '*.php' الفروق الفرق بين ملف أرشيف ومجلّد (في حال عدم ذكر المجلد فالمقارنة تكون مع مجلد بنفس اسم الأرشيف في المجلد الحالي): tar df directory.tar.bz2 البحث عن ملف في الأرشيف: tar df directory.tar.bz2 directory/file1 ملحوظة: يجب في إصداراتٍ من tar تمرير خيار خوارزمية الضغط أثناء استخراج الملفات أو أثناء النظر في فروق ملفات أرشيف مضغوطة)؛ إلا أن الأمر اختياري في أغلب الإصدارات الأخيرة. مثلا: tar xjvf etc.tar.bz2 /etc/postfix/ بدلا من: tar xvf etc.tar.bz2 /etc/postfix/ ترجمة -وبتصرّف- لمقال A tar Primer لصاحبه Daniel Miessler.
  4. ما إن تقضي وقتًا أطول مع لينكس حتى تألف العمل مع سطر الأوامر command line والمعروف أيضًا بالطرفيّة Terminal، وشيئًا فشيئًا ستجد أن الأوامر التي تستخدمها تتكرر ذاتها في كلّ يوم، وأن استعمالاتك لا تخرج عن دائرة صغيرة جدًا من الأوامر والتعليمات المتاحة بالفعل. وقد اجتهد مبرمجو معظم الأوامر والأدوات المستخدمة في الطرفية باختصار طرق استدعائها والعمل من خلالها (تخيّل كم توفّر من نقرات لوحة المفاتيح بكتابة "cd" بدلًا من "change-directory"، أو "ls" بدلًا من "list")، إلا أنّ هذا ليس كل شيء بالطبع، فمعظمنا يستخدم الأوامر مع مجموعة من خياراته المفضّلة. لحسن الحظّ فإن حلًا رائعًا لا يزال بانتظارك؛ حيث تسمح لك الطرفيّة بإنشاء اختصاراتك الخاصّة وحفظ وقتك من خلال ما يسمى بالأسماء المستعارة Aliases والدوال Functions. نناقش في هذا الدرس كيفيّة إنشاء هذه الاختصارات وحفظها بشكل دائم، مع بعض الأمثلة المفيدة التي ستيسر لك عملك بالتأكيد. الإعلان عن اسم مستعار Aliasإنشاء الأسماء المستعارة في الطرفيّة أمرٌ في غاية السهولة، لدرجة أنه يمكنك تجريبه على الفور، يتمّ ذلك باستخدام الأداة alias متبوعة بالاختصار الذي ترغب به، والتي تعرّف اسمًا مستعارًا فعّالا ضمن نافذة الطرفيّة المستخدمة فقط: alias alias_name="command_to_run"انتبه إلى أن أسلوب الكتابة السابق لا يتضمن مسافات فارغة قبل وبعد إشارة المساواة (=)، وهذا ليس أمرًا اختياريًا وإلا فإن الاختصار لن يعمل. لننشئ الآن اسمًا مستعارًا كتجربة، حيث سنأخذ واحدًا من أكثر الأوامر استخدامًا على لينكس وليكن الأمر lsمع الخيار -lha أو -lhA (يهمل الثاني عرض المجلد الحالي ومجلده الأب ضمن الخرج، خلاف الخيار الأوّل)، سنختار له اسمًا مستعارًا وليكن ll: alias ll="ls -lhA"يمكننا الآن كتابة ll للحصول على قائمة بمحتويات المجلد الحالي ضمن قائمة طويلة تتضمن المجلدات المخفيّة: ll -rw-r--r-- 1 root root 3.0K Mar 20 18:03 .bash_history -rw-r--r-- 1 root root 3.1K Apr 19 2012 .bashrc drwx------ 2 root root 4.0K Oct 24 14:45 .cache drwx------ 2 root root 4.0K Mar 20 18:00 .gnupg -rw-r--r-- 1 root root 0 Oct 24 17:03 .mysql_history -rw-r--r-- 1 root root 140 Apr 19 2012 .profile drwx------ 2 root root 4.0K Oct 24 14:21 .ssh -rw------- 1 root root 3.5K Mar 20 17:24 .viminfoوفي حال رغبت بالتوقف عن استخدام الاختصار يمكنك تطبيق الأمر التالي: unalias llوهكذا تُحذف قاعدة الاختصار التي أنشأتها للتوّ. بينما يمكنك الهروب من قاعدة ما بشكل مؤقت عن طريق كتابة رمز الهروب "\" قبل الأمر، فلو قمت بإنشاء قاعدة تحيل الأمر ls إلى الأمر ls -a، وترغب الآن بتطبيق الأمر ls دون استدعاء قاعدة الاختصار، فيمكنك كتابة: \lsيمكنك استعراض جميع القواعد المنشأة في أي وقت من خلال الأمر: aliasلكن كما ذكرنا سابقًا فإن الأسماء المستعارة التي يتم إنشاؤها عن طريق الأداة alias لن تعمل سوى في نافذة الطرفيّة المستخدمة، وهذا يعني أنك لو فتحت نافذة أخرى واستدعيت قاعدة ما فلن تحصل على المطلوب. ولجعل هذه التغييرات دائمة، نحن بحاجة إلى وضعها ضمن أحد الملفات التي تقرأها الطرفية في بداية كل تشغيل لها، الخيارات الشائعة لذلك هي استخدام الملف ~/.bashrc أو ~/.bash_profile، وكل ما علينا فعله هو تحرير أحد هذه الملفات وتعريف قواعد اختصارنا هناك: nano ~/.bashrcالآن أضف الأسماء المستعارة التي كنا قد كتبناها في الطرفيّة بذات الصياغة، يمكنك إضافتها في أسفل الملف، أو في أي مكان آخر، كما يمكنك استخدام التعليقات (بالعلامة #) لتوضيح ما قمتُ بإضافته: ######### # Aliases ######### alias ll="ls -lhA"قد تلاحظ وجود بعض الأسماء المستعارة بالفعل ضمن الملف السابق، حيث تأتي العديد من التوزيعات مع بعض الاختصارات التي تجعل من استخدام الطرفية أمرًا أكثر فاعليّة وسهولة. بعد حفظ الملف تصبح التعديلات المُدخلة جاهزة للاستخدام عند فتح نافذة طرفية جديدة، أما لو رغبت باستعمال قواعد الاختصار الجديدة ضمن نافذة الطرفية الحاليّة فيمكنك كتابة الأمر التالي لإعادة قراءة الملف .bashrc: source ~/.bashrc أمثلة أخرىلنمضي الآن في تعلّم بعض الأمثلة الأخرى عن إنشاء اختصارات تسهّل تعاملك مع الطرفيّة وتجعله أكثر فاعلية، تذكّر دومًا أنه يمكنك البحث في الإنترنت عن استخدامات أخرى نافعة للاختصارات، وإلقاء نظرة على تلك التي قد تكون مُعدّة بشكل افتراضي ضمن إعدادات توزيعتك. التنقل والاستعراضيمكن بإضافة بعض الخيارات على أوامر لينكس البسيطة والشائعة الحصول على نتائج أفضل وأكثر تخصيصًا، رأينا ذلك سابقًا مع الأمر ls، لكن هناك بالتأكيد ما هو أبعد من ذلك. فمثلًا يتيح لنا الاختصار التالي استخدام الخيار -CF مع الأمر ls بشكل افتراضي، والذي يفرّق أثناء العرض بين الملفات والمجلدات، بإضافة الرمز "/" في نهاية اسم كلّ مجلد: alias ls="ls -CF"كما يمكننا الالتفاف حول بعض الأخطاء الكتابيّة الشائعة بالنسبة لنا لجعلها تعمل أيضًا: alias sl="ls"يُنشئ الأمر التالي قاعدة اختصار تُمرّر مخرجات الأمر ls إلى الأداة less لاستعراض محتويات المجلدات الكبيرة بأسلوب مريح: alias lsl="ls -lhFA | less"واحدة من الأخطاء المطبعيّة الشائعة نسيان المسافة بين الأمر cd والنقطتين ..، هذه قاعدة تخرجنا من ذلك المأزق: alias cd..="cd .."أو يمكننا اختصار الأمر بالشكل التالي: alias ..="cd .."وهذه قاعدة أخرى لإنشاء اسم مستعار يسهّل عملية البحث عن الملفات: alias fhere="find . -name "إدارة النظاميحتاج مديرو الأنظمة العاملة بلينكس إلى استخدام الكثير من الأوامر مع تفضيلاتهم الخاصة باستمرار، وهذه فرصة جديدة لتعلّم وإنشاء بعض الاختصارات. تتيح القاعدة التالية إنشاء اسم مستعار يسهّل عرض أقسام واستخدامات القرص الصلب لديك ومعلومات أخرى عنه بطريقة مرتبة باستخدام الأمر df: alias df="df -Tha --total"ويمكن تطبيق نفس القاعدة مع كل من الأمر du والأمر free: alias du="du -ach | sort -h" alias free="free -mt"يستخدم الأمر ps لعرض العمليات والبرامج التي يقوم لينكس بتشغيلها مع معلومات تفصيلية عن كل برنامج، يمكن تسهيل قراءة الخرج من خلال الاختصار التالي: alias ps="ps auxf"كما يمكن إنشاء قاعدة تتيح لنا البحث ضمن جدول الخرج عن عملية محدّدة للاكتفاء بعرضها فقط مما يوفر لنا الوقت: alias psg="ps aux | grep -v grep | grep -i -e VSZ -e"فمثلًا للحصول على معلومات العملية bash فقط يمكن كتابة الأمر التالي: psg bash USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 1001 5227 0.0 0.0 26320 3376 pts/0 Ss 16:29 0:00 bashأمثلة إضافيّةيعمل الأمر mkdir على إنشاء مجلّد جديد، لكن عند اختيار اسم لمجلد موجود بالفعل يعيد لنا رسالة خطأ، يمكن استخدام الخيار -p مع الأمر السابق لإهمال تلك الرسالة (ودون إنشاء المجلد)، كما يمكن عن طريق قاعدة الاختصار التالية جعل هذا الخيار افتراضيًا: alias mkdir="mkdir -p"أيضًا بإضافة الخيار v إلى الأمر السابق نحصل على المزيد من التنسيق، ففي حال وجود مجلد بذات الاسم يتم تجاهل الأمر وعدم عرض رسالة خطأ، أما لو كان الاسم غير مُستخدم فيعيد الأمر السابق خرجًا على الشاشة يؤكّد عملية إنشاء المجلد بنجاح: alias mkdir="mkdir -pv"في معظم الحالات التي نستخدم بها الأمر wget لتحميل ملف ما من الويب فإننا غالبا ما نمرّر له الخيار -c لدعم استكمال التنزيل في حال حدوث خطأ بالاتصال، لجعل ذلك افتراضيًا ننشئ القاعدة التالية: alias wget="wget -c"يعتبر الأمر history واحدًا من الأدوات الفعّالة، حيث يتيح لك البحث ضمن الأوامر التي سبق واستخدمتها، ويطبع لك النتائج المطابقة على الشاشة مرفقة بأرقامها التسلسليّة (حسب التنفيذ)، حيث يمكن استدعاء الأمر مجددًا من رقمه مسبوقًا بإشارة (!): alias histg="history | grep"كما هو معروف، تتوفر بعض أدوات الطرفية بنسختين، تكون الأولى أكثر بساطة، فيما تقدّم الأخرى ميزات وخدمات أكثر، ومن خلال إنشاء الاختصارات سيكون بإمكانك تشغيل النسخة المحسّنة بنفس أمر تشغيل النسخة الأولى. فالأمر top على سبيل المثال يملك نسخة محسنة وملونة بالاسم htop (إذا لم تكن لديك ركبّها من مدير الحزم في توزيعتك أولًا)، وبإنشاء قاعدة الاختصار التالي نعمّم استخدام النسخة المحسنة في كل التطبيقات الأخرى التي تستعملها: alias top="htop"تقدّم الأداة ncdu عرضًا تحليليًا لاستخدام مساحة القرص، الملفات والمجلدات في لينكس بأسلوب تفاعليّ وخيارات متنوّعة: alias du="ncdu"يستبدل الأمر السابق الأداة du بالأداة ncdu، كما يمكن استبدال الأداة df بـ pydf المحسّنة من خلال: alias df="pydf"هل ترغب في معرفة رقم الـ IP الخاص بجهازك؟ أنشئ القاعدة التالية: alias myip="curl http://ipecho.net/plain; echo"فكّر دومًا كيف يمكنك الاستفادة من القوّة الرهيبة للأسماء المستعارة، على سبيل المثال إذا كنتَ تدير موقعًا على الإنترنت بينما يلزمك باستمرار إعادة تحجيم الصور التي ترغب برفعها إلى الموقع لتناسب مقاسًا مخصصًا، يمكنك تركيب الأداة imagemagick من مدير الحزم في توزيعتك، وإنشاء قاعدة تسهل عليك العمل: alias webify="mogrify -resize 690\> *.png"حالما تطبّق الأمر الجديد webify سيتم إعادة تحجيم جميع الصور الموجودة ضمن المجلّد النشط عندما يكون عرضها أصغر من 690px. وبذات الطريقة يمكنك تسهيل رفعها إلى الخادوم الخاص بك: alias upload="sftp username@server.com:/path/to/upload/directoryالدوالكما رأينا فإن ميزة الأسماء المستعارة توفّر أسلوبًا رائعًا في اختصار تنفيذ الأوامر وتسهيل مراكبتها، إلا أنها في النهاية محدودة القدرة، إذا لا يمكننا على سبيل المثال تطبيق سلسلة طويلة من الأوامر معًا في اختصارٍ واحد. لحسن الحظ فهناك ما يساعدنا لتلبية هذه المتطلبات، تُقدّم الدوال functions أسلوبًا بسيطًا في اختصار تنفيذ قطعة من الأوامر دفعة واحدة، وهي أسلوب يقع بين ميزة الأسماء المستعارة وبين كتابة النصوص التنفيذيّة shell scripts، وتعمل بذات طريقة الأسماء المستعارة، كما يمكنها استقبال الدخل من المستخدم لمعالجته. سنتحدث في هذه الفقرة عن الاستخدامات الأساسية لميزة كتابة الدوال، مع بعض الأمثلة التوضيحيّة، متجنبين التفاصيل الواسعة لها، والتي يمكن من خلالها برمجة نصوص تنفيذيّة متقدّمة. لتعريف دالّة لدينا أسلوبين أساسيين، يستخدم الأوّل الأمر function ويأخذ الشكل العام كالتالي: function function_name { command1 command2 } بينا يشبه الأسلوب الآخر نمط الأقواس في لغة C: function_name () { command1 command2 }يمكن ضغط مساحة الأسلوب السابق ليُكتب في سطر واحد باستخدام الفاصلة المنقوطة بين الأوامر، انتبه إلى أن الفاصلة المنقوطة يجب أن تلتصق بالأمر الذي يسبقها: function_name () { command1; command2; }لنبدأ مع مثال بسيط، عادةً عندما نقوم بإنشاء مجلد جديد ضمن الطرفية فإن الخطوة التالية مباشرة هي الدخول إليه، سنكتب دالة لذلك؛ تنشئ مجلد جديد ثم تنتقل إليه: mcd () { mkdir -p $1 cd $1 }الآن يمكن استخدام الدالة mcd بدلًا من mkdir ثم cd: mcd test pwd /home/demouser/testالدالة التالية تعرض مثالًا متقدمًا على ما يمكن كتابته وتنفيذه عن طريق الطرفية، وهي تعمل على فكّ ضغط أنواع كثيرة من تنسيقات الملفات المضغوطة: function extract { if [ -z "$1" ]; then # display usage if no parameters given echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>" else if [ -f $1 ] ; then # NAME=${1%.*} # mkdir $NAME && cd $NAME case $1 in *.tar.bz2) tar xvjf ../$1 ;; *.tar.gz) tar xvzf ../$1 ;; *.tar.xz) tar xvJf ../$1 ;; *.lzma) unlzma ../$1 ;; *.bz2) bunzip2 ../$1 ;; *.rar) unrar x -ad ../$1 ;; *.gz) gunzip ../$1 ;; *.tar) tar xvf ../$1 ;; *.tbz2) tar xvjf ../$1 ;; *.tgz) tar xvzf ../$1 ;; *.zip) unzip ../$1 ;; *.Z) uncompress ../$1 ;; *.7z) 7z x ../$1 ;; *.xz) unxz ../$1 ;; *.exe) cabextract ../$1 ;; *) echo "extract: '$1' - unknown archive method" ;; esac else echo "$1 - file does not exist" fi fi }تعمل الدالة على تحديد تنسيق الملف واختيار الأمر المناسب له للتنفيذ. خاتمةنأمل أن يكون هذا الدرس قد أعطاك بعض الإلهام لكتابة قواعد الاختصار والدوال التي تناسبك، مما يسهّل عليك أداء مهامك الروتينيّة وإضافة بعض المتعة على سطر الأوامر. تذكّر أن تبقى حذرًا من إعادة تعريف بعض الأوامر الأساسية بصوّرة قد تسبب مشاكل أو أخطاء قاتلة، كن حذرًا ولا تنشئ اختصارات تؤثّر على ملفات النظام. نقطة البداية الجيدة هي من سجل الأوامر التي كنتَ قد استخدمتها بالفعل في الفترة الماضية، لترى مالذي يتكرّر باستمرار، وتعمل على اختصار العمل من خلال إنشاء أسماء مستعارة جديدة: history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] &quot; &quot; CMD[a]/count*100 &quot;% &quot; a;}' | grep -v &quot;./&quot; | column -c3 -s &quot; &quot; -t | sort -nr | nl | head -n10يعرض السطر السابق خرجًا بالأوامر الأكثر تكرارًا في استخدامك اليوميّ ونسبها المئوية، مما يعطيك الفكرة عن احتياجاتك الحاليّة. نسعد أيضًا بمشاركتكم لنا الاختصارات والدوال التي تستخدمونها عادةً لتبادل الخبرات. ترجمة -وبتصرّف- للمقال An Introduction to Useful Bash Aliases and Functions.
  5. يُعتبر تشغيل التطبيقات على خادوم لينكس أمرًا اعتياديًا كما هو الحال مع أي جهاز حاسوب آخر، ويطلق الحاسب على تلك التطبيقات اسم "العمليات" Process. وبينما يعالج لينكس من وراء الكواليس العمليات على المستوى المنخفض ويدير [دورة حياتها][1] إلا أنك لا تزال بحاجة إلى أدوات تساعدك على إدارة هذه العمليات في المستوى العالي higher-level لإدارة النظام. في هذا الدّرس سنناقش بعض الجوانب البسيطة في إدارة العمليات تحت أنظمة لينكس، والتي توفّر عددًا كبيرًا من الأدوات لهذا الغرض. تم تطبيق الأمثلة على خادوم خاص VPS يعمل بتوزيعة Ubuntu 14.04، إلا أنها ستعمل بالتأكيد بذات الطريقة مع باقي التوزيعات. كيفية استعراض العمليات النشطة في لينكسtopلاستعراض العمليات النشطة حاليًا على الخادوم يمكن بسهولة تشغيل الأمر top: top top - 15:14:40 up 46 min, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1019600k total, 316576k used, 703024k free, 7652k buffers Swap: 0k total, 0k used, 0k free, 258976k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0 8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset 9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs تضم السطور الأولى للخرج السابق معلومات عامة عن النظام مثل مدّة تشغيله، معدّل استخدام المعالج، عدد العمليات، وغيرها، ويمكن ملاحظة وجود عملية واحدة نشطة في مثالنا هذا، إضافة إلى 55 عملية في حالة سكون idle أي لا تستخدم شيئًا من موارد المعالج CPU. بينما يضم القسم الآخر والموزع في جدول على العمليات النشطة إضافةً لمعلومات مختلفة عنها (مثل مقدار استهلاكها للذاكرة أو المعالج). htopالنسخة المُحسّنة من top تدعى htop، وهي متاحة في المستودعات الرسمية لمعظم التوزيعات، على Ubuntu يمكن تركيبها بالأمر التالي: sudo apt-get install htopيعرض الأمر htop الخرج بأسلوب أيسر في القراءة والفهم: htop Mem[||||||||||| 49/995MB] Load average: 0.00 0.03 0.05 CPU[ 0.0%] Tasks: 21, 3 thr; 1 running Swp[ 0/0MB] Uptime: 00:58:11 PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 1259 root 20 0 25660 1880 1368 R 0.0 0.2 0:00.06 htop 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 /sbin/init 311 root 20 0 17224 636 440 S 0.0 0.1 0:00.07 upstart-udev-brid 314 root 20 0 21592 1280 760 S 0.0 0.1 0:00.06 /sbin/udevd --dae 389 messagebu 20 0 23808 688 444 S 0.0 0.1 0:00.01 dbus-daemon --sys 407 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.02 rsyslogd -c5 408 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 409 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 406 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.04 rsyslogd -c5 553 root 20 0 15180 400 204 S 0.0 0.0 0:00.01 upstart-socket-brلقراءة المزيد عن استخدام الأمرين top و htop هنا. استخدام ps في عرض العملياتكما شاهدنا فكلا الأداتين top و htop تعرضان العمليات بشكل مشابه لمدير المهام في الواجهات الرسومية، إلا أنهما ليستا مرنتين كفايةً لتغطية كافة الاحتياجات، وهنا يأتي دور الأداة ps للتعويض عن هذا القصور. للوهلة الأولى قد يخيب أملنا فيما لو استدعينا الأمر ps مباشرةً ودون معطيات Arguments إضافية، حيث لن يزيد عدد أسطر الخرج عن اثنين مع ثلاثة أعمدة: ps PID TTY TIME CMD 1017 pts/0 00:00:00 bash 1262 pts/0 00:00:00 psوالسبب هو أن الأمر ps بشكله المجرّد يعرض العمليات المرتبطة بالمستخدم الحالي وجلسة الطرفية فقط، وبالنظر إلى أننا لم نشغّل سوى الطرفية مع الأمر ps فإن الخرج السابق يبدو طبيعيًا. أما لاستعراض تفاصيل أكثر عن عمليات نظامنا الحالي يمكننا تشغيل الأمر التالي: ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 24188 2120 ? Ss 14:28 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:28 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:28 0:00 [ksoftirqd/0] root 6 0.0 0.0 0 0 ? S 14:28 0:00 [migration/0] root 7 0.0 0.0 0 0 ? S 14:28 0:00 [watchdog/0] root 8 0.0 0.0 0 0 ? S< 14:28 0:00 [cpuset] root 9 0.0 0.0 0 0 ? S< 14:28 0:00 [khelper] . . . مع الخيار aur سوف يعرض الأمر ps العمليات التي تخص كافة المستخدمين على شكل جدول سهل الفهم. كما يمكننا ترتيب عرض العمليات بشكل متسلسل يوضّح العلاقات فيما بينها عن طريق إضافة الخيار axjf للأمر: ps axjf PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 2 0 0 ? -1 S 0 0:00 [kthreadd] 2 3 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/0] 2 6 0 0 ? -1 S 0 0:00 \_ [migration/0] 2 7 0 0 ? -1 S 0 0:00 \_ [watchdog/0] 2 8 0 0 ? -1 S< 0 0:00 \_ [cpuset] 2 9 0 0 ? -1 S< 0 0:00 \_ [khelper] 2 10 0 0 ? -1 S 0 0:00 \_ [kdevtmpfs] 2 11 0 0 ? -1 S< 0 0:00 \_ [netns] . . .وكما ترى يمكننا بسهولة ملاحظة أن العملية kthreadd هي عملية أب للعملية ksoftirqd/0 وما يليها. ملاحظات حول معرّفات العمليات Process IDsيخصّص لينكس والأنظمة الشبيهة بيونكس رقمًا معرفًا لكل عملية Process ID أو ما يعرف بـ PID، حيث يتمكّن النظام من التعرف بذلك على العمليات وتعقبها أثناء التشغيل. يتيح الأمر pgrep أسلوبًا سهلًا للحصول على رقم PID لأيّة عملية، حيث يستعلم عنه ويعيده كخرج على الشاشة: pgrep bash 1017 كمثال آخر فإن أوّل عملية يتم إطلاقها أثناء الإقلاع والتي تدعى init تعطى رقم PID يساوي الواحد: pgrep init 1تعمل هذه العملية على متابعة تشغيل باقي العمليات أثناء تشغيل النظام، كما أنها مسؤولة عن تشغيل باقي الخدمات، وفي المقابل فإن آخر عملية يتم تشغيلها تأخذ أكبر رقم PID. نقول عن عملية ما أنها عملية أب Parent Process إذا كانت تتولى تشغيل عملية أخرى، وهذا يعني أنه إذا تم إيقاف العملية الأب بشكل إجباري (أي قتلها) فستنهار العملية الابن، يشار في هذه الحالة لرقم PID الخاص بمعرّف عملية أب برقم PPID. تعرض الأدوات السابقة (top, htop, ps) أعمدة تضم أرقام كلًا من PID و PPID الخاصة بالعمليات المختلفة، إذ تتم إدارة العمليات بين المستخدم والنظام من خلال استدعاء رقم العملية بدلًا من اسمها. كيفية إرسال إشارات للعمليات في لينكستستجيب جميع العمليات في لينكس إلى نظام الإشارات، والإشارات Signals هي أسلوب يتبعه نظام التشغيل لإدارة العمليات (كتعديلها أو إنهائها)، ويقصد بذلك تنفيذ إجراء للعملية عند تمرير إشارة ما. إرسال إشارة لعملية عن طريق PIDيعتبر الأمر kill واحدًا من أكثر الأمثلة شيوعًا عن تمرير إشارة لبرنامج، وكما هو متوقع فإن الوظيفة التي تقوم بها هذه الأداة هي محاولة الإيقاف الإجباري للعملية: kill PID_of_target_processيرسل الأمر السابق إشارة "إمهال" للعملية، والتي تحمل رسالة مفادها: انتهِ رجاءً.. وهذا ما يسمح للبرنامج بتنفيذ عمليات تنظيف الذاكرة والإغلاق بشكل طبيعي، أما فيما لو انتهت مهلة الإشارة ولم يستجب لها البرنامج، فيمكننا زيادة قّوة الإشارة بإضافة المعامل "-KILL" لها: kill -KILL PID_of_target_processفي هذه الحالة لا يتم إرسال الإشارة إلى البرنامج، وبدلًا من ذلك يتم تمريرها إلى نواة نظام التشغيل مباشرةً لإغلاق العملية، تُستعمل هذه الإشارة في الحالات التي لا تستجيب فيها العمليات لطلبات الإنهاء. وكما هو الحال مع العمليات، تملك الإشارات أرقامًا خاصة يمكن استخدامها أثناء تمريرها. على سبيل المثال يمكن تمرير الرقم "-15" بدلا من "-TERM"، و "-9" بدلًا من "-KILL". استخدامات أخرى للإشاراتلا يقتصر عمل الإشارات على إيقاف تشغيل البرامج، بل يمكن تنفيذ إجراءات أخرى معها، مثل إعادة تشغيل بعض خدمات daemons عند تمرير HUP لها، أباتشي Apache واحدة من هذه الخدمات: sudo kill -HUP pid_of_apacheعند تنفيذ الأمر السابق سيعيد Apache تحميل ملف الضبط الخاص به ومن ثم يستأنف الخدمة. لاستعراض جميع الإشارات التي من الممكن استخدامها مع الأمر kill اكتب: kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM . . . إرسال إشارة لعملية باستخدام الاسمعلاوةً على الأسلوب السابق في استخدام معرّفات PID لإرسال الإشارات المختلفة إلى العمليات، تتيح الأداة pkill إرسال الإشارات عن طريق أسماء العمليات نفسها، حيث الأمر: pkill -9 pingيكافئ تمامًا الأمر: kill -9 `pgrep ping` كما يمكنك إرسال إشارة ما إلى مجموعة عمليات من أسرة واحدة باستخدام الأمر: killall: killall firefox حيث يرسل الأمر السابق إشارة المهلة TERM signal لكل عملية نشطة على الكمبيوتر تحمل الاسم firefox. ضبط أولويات العملياتفي إدارتك للخادوم الخاص بك كثيرًا ما ستحتاج إلى كيفية تضبط بها أولويات العمليات، لتحدّد أيها التي ترغب بإعطائها أفضلية قصوى، ففي حالاتٍ متفرقة تكون بعض العمليات حساسة وذات أهمية عالية، بينما يمكن لباقي العمليات أن تنتظر قليلًا من الوقت بينما تتوفر موارد شاغرة. يتم التحكم بأولويات العمليات في لينكس من خلال قيمة يطلق عليها اسم niceness. المهام ذات الأولوية المرتفعة تدعى less nice، باعتبار أنها لا تسمح بمشاركة موارد الخادوم كما يجب، وفي المقابل يطلق على العمليات ذات الأولوية المنخفضة اسم nice باعتبار أنها لا تستهلك سوى أقل قدر من الموارد فقط. وبالعودة إلى مخرجات الأمر top سنجد أن هناك عمود يدعى "NI" والذي يحدد قيمة الـ nice لكل عملية: top Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1019600k total, 324496k used, 695104k free, 8512k buffers Swap: 0k total, 0k used, 0k free, 264812k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1635 root 20 0 17300 1200 920 R 0.3 0.1 0:00.01 top 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0حيث العمليات التي تأخذ قيمة من المجال "-19/-20" تعتبر ذات أولوية عالية، وتلك التي تأخذ قيمة محصورة ضمن المجال "19/20" تعتبر ذات أولوية منخفضة، وهذا يعتمد على نظام التشغيل. لتشغيل برنامج وفق قيمة محدّدة لـ nice يمكن استعمال الأمر التالي: nice -n 15 command_to_executeللتأكيد؛ الأمر السابق يُستخدم لتشغيل أمر جديد بقيمة محدّدة لـ nice، أما لتغيير قيمة nice لبرنامج يعمل بالفعل فإننا نستخدم أداة تدعي renice: renice 0 PID_to_prioritizeانتبه، بينما تتعامل الأداة nice مع العمليات وفق أسمائها، فإن renice تفعل ذلك باستخدام معرّفات PID، فوجب التفريق. خاتمةأحيانًا يشعر المستخدمون الجدد بصعوبة في فهم إدارة العمليات في لينكس والتعامل معها، باعتبار أن ذلك يتمّ ضمن سطر الأوامر خلافًا لما ألفوه من بدائل في الواجهات الرسومية. غير أن هذه الأفكار ما تلبث أن تصبح مألوفة وسهلة الاستخدام مع بعض الممارسة اليومية، إذ أن تعلم إدارة العمليات في لينكس يعدّ مهارة أساسية في كل ما تفعله مع نظام التشغيل. [1]: دورة حياة العملية أو Process Lifecycle، هي أسلوب في فهم "العمليات" انطلاقا من الحالة الابتدائية لها، مرورًا بمراحل النضج وحتى المرحلة النهائية لتطورها ونموها، حيث فهم وتحليل العمليات بهذا الأسلوب يساعدنا على فهم الكيفية التي تنسجم أو تتناسب بها العمليات مع النظام وفق صيرورة من النمو والنضج. ترجمة -وبتصرّف- للمقال How To Use ps, kill, and nice to Manage Processes in Linux
  6. حول لينكسغنو لينكس GNU/Linux هو نظام تشغيل حرّ ومفتوح المصدر يدمج بين مشروعين مختلفين، الأول هو مشروع GNU لكتابة نظام تشغيل حرّ من الصفر والذي كاد يجهز مع بداية التسعينات باستثناء الجزء المسمّى بنواة النظام، في هذه الأثناء كان لينوس تورفالدز قد طوّر نواة نظام تشغيل كهواية، فجاءت الفكرة لاختصار الجهد بدمج المشروعين وتقديمهما تحت اسم غنو لينكس، والذي سيشيع لاحقًا باسم لينكس. ورغم أن لينكس سهل الاستخدام إلا أن القادمين الجدد من Windows يجدون صعوبة في فهم بنيته والتعامل معها، لذا سنستعرض في هذا الدرس بعض المفاهيم والأدوات الأساسيّة حول لينكس. الطرفيّةقبل أواخر التسعينيات زُوّد نظام التشغيل غنو لينكس بواجهات رسوميّة لتسهيل التعامل معه، إلا أنّ الطرفيّة (والتي يمكن تشبيهها مبدئيًا بموجّه الأوامر في Windows) لا تزال أداة قويّة وفعّالة في كثيرٍ من الحالات، لا سيما عند إدارتك لخادوم يعمل تحت نظام لينكس، حيث يتمّ ذلك عبر سطر الأوامر فقط، إذ تنفّذ جميع المهام الإدارية من خلال كتابة الأوامر والضغط على زرّ الإدخال Enter لتنفيذها، يشمل ذلك التعديل على الملفات، تركيب الحزم، وإدارة المستخدمين. الطرفية ببساطة هي تلك النافذة السوداء التفاعلية، حيث نكتب الأوامر لتنفيذها، بينما تعيد هي الخرج لنا طباعةً على الشاشة نفسها. التعامل مع المجلدات ضمن الطرفيةيُؤسّس نظام الملفات في لينكس على شكل شجرة من الأدّلة، بحيث يمكنك إنشاء المجلدات داخل بعضها البعض، وإنشاء الملفات في أيٍ مجلدٍ منها. لمعرفة ما هو الدليل الذي تقف عنده حاليًا، نفّذ الأمر: pwdيمثّل الأمر السابق اختصارًا لعبارة "print working directory" أو "اطبع مجلد العمل الحالي"، وسوف يعيد لنا على الشاشة مسار المجلد النشط حاليًا، وهو غالبًا ما سيكون شيء مشابه لما يلي: /home/foo/ وهذا يعني بأن المجلّد النشط حاليًا هو "foo" والموجود داخل المجلد "home" والمضمّن بدوره داخل الدليل الجذر "/"، يُقصد بالمجلّد النشط ذاك الذي ستنفّذ عنده الأوامر المُدخلة، لتوضيح هذه الفكرة سنطبّق الأمر "ls" والذي يعرض الملفات والمجلدات الموجودة في الدليل النشط: ls يعرض خرج الأمر السابق أسماء الملفات والمجلدات الموجودة ضمن الدليل "foo"، ولتغيير المجلد النشط نستخدم الأمر cd، وهو اختصار لعبارة "change directory" أو غيّر الدليل/المجلد: cd <name of directory>للدخول إلى مجلد مضّمن بالدليل النشط يُكتفى بكتابة اسمه مباشرةً، بينما للانتقال إلى دليل آخر خارج "foo" فيجب كتابة مساره كاملًا، تحقّق دومًا من المسار النشط بالأمر pwd. إضافةً لذلك يمكن استخدام اللاحقة .. للانتقال مجلد واحد إلى الأعلى ضمن المسار نفسه: cd .. لإنشاء مجلد جديد نستخدم الأمر mkdir (لا تنس أن الأمر سينفذ ضمن المجلد النشط حاليًا وسيُنشأ المجلد هناك): mkdir bar يتيح لنا الأمر rm حذف المجلدات والملفات التي لم نعد بحاجة إليها، وعن طريق إضافة اللاحقة -d سينفذ الأمر فقط في حال كان المجلد فارغًا: rm -d barبينما نستخدم اللاحقة R- تعني Recursive أي تكرارية وهي لحذف المجلد ومحتوياته. التعامل مع الملفات ضمن الطرفيةلاستعراض محتويات ملف ما نستخدم الأمر cat؛ لنقل أنه لدينا الملف baz ضمن الدليل الحالي، يَطبع الأمر التالي محتويات هذا الملف على شاشة الطرفية: cat bazمع الملفات الطويلة لن يكون الأمر السابق مجديًا، حيث سَيَعرض لنا الصفحة الأخيرة فقط من الملف على شاشة الطرفية، وسنحتاج إلى الصعود يدويًا للوصول إلى الصفحة الأولى ومن ثم تقليب الصفحات نزولًا! للتعامل مع مثل هذه الملفات نستخدم الأمر less والذي يعرض الصفحة الأولى من الملف، ومن خلال الضغط على زر المسافة Space يمكننا تقليب الصفحات وصولًا إلى نهاية الملف: less bazيمكننا أيضا استخدام زر السهم السفلي للنزول سطر واحد إلى الأسفل، والضغط على زر "q" لإنهاء العرض. لإنشاء ملفات جديدة سوف نستخدم الأداة touch: touch foobarيُنشئ الأمر السابق ملفًا فارغًا باسم foobar داخل الدليل النشط لديك. إذا لم يعجبك الاسم السابق فيمكنك استخدام الأمر mv لإعادة تسميته: mv foobar fizzbuzz الأمر mv هو اختصار للكلمة move أو "حرّك"، ويمكن استخدامه لنقل ملف أو مجلد من مكانٍ لآخر، أو لإعادة التسمية مع النقل: mv foobar Docs/fizzbuzz ينقل الأمر السابق الملف foobar إلى المجلد Docs الموجود ضمن الدليل الحالي، ويُعيد تسميته إلى fizzbuzz. كما يمكننا استخدام الأمر cp لنسخ الملف foobar إلى الدليل المطلوب باسم جديد، بحيث يبقى الملف الأصليّ دون تعديل: cp foobar Docs/fizzbuzz الأمر cp هو اختصار للكلمة "copy" أو "انسخ"، ويمكننا استخدامها بالشكل التالي أيضًا: cp foobar fizzbuzz وهكذا نحصل على نسختين من الملف باسمين مختلفين ضمن المجلد نفسه. لكن ما هي قيمة ملف فارغ؟ للتعديل على ملف ضمن الطرفية نحتاج إلى محرّر نصيّ، ولدينا بالتأكيد العديد من الخيارات، مثل محرري vim و emacs الشهيرين، أو محرر nano الأكثر بساطة وشبيهه pico. للمبتدئين فإن المحرر nano هو خيار ممتاز، نظرًا لسهولة التعامل معه وبساطة تعلمه، دون الحاجة إلى كتب أو دورات تعليمية! ببساطة؛ للتعديل على الملف foobar نستخدم الأمر: nano foobar والذي سينقلنا إلى واجهة المحرّر البسيطة ومساحة فارغة للكتابة، بعد الانتهاء من الكتابة ولحفظ العمل نضغط على Ctrl-X ، حيث يسألنا المحرر عن رغبتنا بحفظ التعديلات، نضغط y للموافقة ثم Enter لنعود مجددًا إلى الطرفية. ملفنا الآن يضم بعض النصوص التي أدخلناها للتوّ، ويمكن التحقق من ذلك بعرض محتوياته باستخدام إحدى الأداتين cat أو less. أخيرًا، يمكنك حذف الملف بواسطة الأمر rm: rm fizzbuzz وخلافًا للمجلدات، تُحذف الملفات بغض النظر عن وجود محتوى ضمنها من عدمه. التسلسل الهرمي القياسي لنظام الملفاتتتوافق جميع توزيعات لينكس تقريبًا مع ما يسمى بالتسلسل الهرمي القياسي لنظام الملفات أو FHS، والذي يحدّد الأدلة الرئيسية؛ أغراضها ومحتوياتها في نظام التشغيل. ووفق هذا النظام يشار بالرمز "/" إلى المجلد الأساسي أو جذر النظام، والذي تتفرع منه جميع الملفات والأدلة الأخرى. الدليل "/home/" يحتوى على المجلدات الخاصة بمستخدمي النظام، والتي تضم ملفاتهم وإعدادات برامجهم، فمثلًا يمكنك مشاهدة مجلد يحمل اسم مستخدمك الحالي ضمنه، أما المستخدم الجذر فله دليل آخر وهو "/root/". بشكل عام غالبًا ما يمكنك الاعتماد على بديهتك في فهم أغراض الأدلة الرئيسيّة، فحالما تجد الدليل boot ستتوقع أنه مخصّص لملفات الإقلاع، والدليل dev متعلّق بالأجهزة، وهكذا.. ندعوك لمراجعة مقالة كيف تفهم هيكلية نظام الملفات في لنكس على أكاديمية حسوب. الأذوناتيُعتبر لينكس نظام متعدّد المستخدمين بشكل حقيقي، إذ يتيح إمكانية تحديد أيّ الملفات يمكن للآخرين مشاهدتها أو التعديل عليها وأيّها تُحفظ بحيث يتمكن مالكها فقط من التعامل معها. تُسمّى القواعد التي تُنظّم وتدير هذه الإمكانية بالأذونات أو الصلاحيات Permissions. وعلى غرار يونكس، يقسّم لينكس المستخدمين إلى ثلاث فئات؛ المالك، المجموعة المالكة، والآخرين، كما يقسّم الصلاحيات إلى ثلاثة أنواع؛ القراءة، الكتابة، والتنفيذ. للمزيد حول موضوع الأذونات يمكنكم قراءة مقالنا السابق عنها من هنا. تعلّم ذاتيًالم نقدّم في درسنا هذا سوى بعض المفردات الأساسيّة في التعامل مع بيئة أنظمة لينكس، إلا أنك بالتأكيد تحتاج إلى ما هو أبعد من ذلك لتممكن من فهم واستخدام لينكس بشكل مثالي. يمكنك قراءة المزيد حول كيفيّة إنجاز مختلف المهام في لينكس ضمن الأكاديميّة هنا، كما يمكنك استخدام محركات البحث لاستطلاع المزيد وإيجاد حلول لمشكلاتك، تذكّر أنّ السؤال الذي يدور ببالك قد سأله آخرون من قبل وتمّت إجابتهم بشكل شافٍ، لذا ابحث أولًا ودومًا عن كل ما يعترض طريقك، كُن فضوليًا حيال ذلك. يأتي لينكس أيضًا مع مجموعة ضخمة من الدلائل التعليميّة المتعلّقة بكافة الأوامر التي يمكن استخدامها ضمن الطرفية، للقراءة حول أي أمر استخدم التعليمة التالية: man <command> فعلى سبيل المثال للقراءة حول الأمر rm نكتب: man rm حيث يعرض لنا دليل مفصّل يشمل الغرض من الأمر، الخيارات المتاحة له، أمثلة عن الاستخدام، والمزيد من المعلومات القيّمة. البحث عن المعلومات مهارة أساسية في عصرنا اليوم، وهي ستخدمك كثيرًا بتعزيز مهاراتك وإمكانياتك المهنيّة في التعامل مع نظام التشغيل لينكس، طالما تحلّيت بالصبر والفضول.
  7. يهدِف هذا الدّليل إلى شرح طريقة كتابة سكربتات Shell لتحقيق أغراض مختلفة. يُمكن أن تُستخدم سكربتات Shell لتنفيذ أوامر عديدة، أمر واحد بمعطَيات Arguments كثيرة معقَّدة، أو واجهات أكثر سهولةً في الاستخدام لتوزيع عملك. في الأساس، تُستخدَم سكربتات Shell لتسهيل بعض الأعمال بتشغيلها آليًّا دون اللّجوء لإعادة كتابتها في كلّ مرة تحتاجها. أساسيّات كتابة سكربتات Shell1- تهيئة مجلّد العملمن الجيّد، قبل البدء في كتابة سكربتات Shell، إعدادُ مجلّد لوضعها فيه. يُنصَح بوضع السكربتات الشّخصيّة في مجلّد يوجد على المسار bin/~. ننشئ هذا المجلّد عبر الأمر التّالي: mkdir ~/binنُضيف مسار المجلّد إلى المتغيّر PATH وذلك بتعديل ملفّ etc/profile/ على النّحو التّالي: sudo nano /etc/profileونُضيف الأسطُر التّالية إلى الملفّ: PATH=$PATH:$HOME/bin export PATHاستخدم زرّي CTRL وO لحفظ التّعديلات، وCTRL+X للخروج من محرّر النّصوص nano. ثمّ نعتمد التّغييرات عبر تنفيذ الأمر: source /etc/profileبعض توزيعات لينكس لا تدعم أمر source، في هذه الحالة ينبغي إعادة تشغيل النّظام لاعتماد التّعديلات: sudo rebootملحوظة: للتّأكّد من اعتماد التّغييرات استخدِم الأمر التّالي: printenv PATHوتأكّد من وجود مسار مجلّد السكربتات ضمن المسارات العروضة (يُفصَل بين المسارات بنقطتيْن عموديّتيْن هكذا :). 2- إنشاء ملفّينبغي إنشاء ملفّ تنفيذيّ Executable file حتى يُمكن تشغيل السكربت. الأمران التّاليّان يؤدّيان هذه المهمّة؛ الأوّل ينشِئ ملفًّا والثّاني يجعله قابلًا للتّنفيذ: touch ~/bin/firstscript chmod +x ~/bin/firstscriptنفتح الملفّ بمحرّر نصوص nano للبدْء في إضافة الأوامر إلى السكربت: nano ~/bin/firstscriptتجب إضافة السّطر التّالي في بداية الملفّ حتّى يعرف النّظام أنّه سكربت Shell وبالتّالي ينفّذ الأوامر الموجودةَ فيه بالطّريقة الصّحيحة: #!/bin/shأصبح الملفّ الآن جاهِزًا ليستقبل أي أمر من أوامر لينكس، مثلًا: clear echo "Hello World!"نحفظ الملفّ (CTRL+O) ثمّ نخرج من محرّر النّصوص (CTRL+X). تكفي الآن كتابة اسم السكربت ثم الضّغط على Enter لتنفيذه: firstscriptلا يهمّ من أيّ المسارات نفّذت السكربت، مادام مجلّد العمل موجودًا ضمن متغيّر البيئة PATH. ينبغي أن تحصُل على النّتيجة التّاليّة: 3- مثال لسكربتيُعدّ التّشغيل الآليّ للأعمال المتكرّرة أحد أكثر المجالات الّتي تُستخدَم فيها سكربتات Shell. على سبيل المثال؛ إذا كنت دائمًا تنقل الكثير من الملفّات إلى مجلّد نسخ احتيّاطي Backup، وليكن backup/~، فإنّ بإمكانك إعداد سكربت ينقل أي ملفّ تحدّده إلى المجلّد المطلوب. بهذه الطّريقة يمكن أن تكتُب: filebackup file-name1 file-name2 ...فلنلقِ نظرة على ما نحتاج لمعرفته، قبل البدْء في كتابة السكربتات. أوّل ملحوظة هي أنّ سكربتات Shell لا تستخدم التّرميز الصّلب Hard coding. يعني هذا، في إطار مثالنا، أنّه يمكنك بسهولة تغيير مجلّد النّسخ الاحتيّاطي إذا أردت. كلّ ما عليك فعله هو تعديل أحد الأسطُر الأولى في ملفّ السكربت؛ حيثُ سيظهر المتغيّر الّذي سيخزّن مسار المجلّد مرةً واحدة فقط. لن تحتاج لتعديل ملفّ السكربت لتجربة التّعامل مع المتغيّرات، يمكن ذلك مباشرةً في سطر الأوامر عن طريق كتابة ما يلي: testvariable=teststringأعطينا القيمة teststring للمتغيّر testvariable. يطبع أمر echo محتوى المتغيّر (لاحِظ استخدام $ أمام اسم المتغيّر): echo $testvariableستظهر في سطر الأوامر قيمة المتغيّر testvariable أيّ teststring. يمكننا الآن بعد هذا الاختبار البسيط لعمل المتغيّرات البدءُ في كتابة السّكربت؛ الخطوات هي نفسُها الّتي تحّثنا عنها أعلاه: إنشاء الملفّ، جعله قابلًا للتّنفيذ، ثمّ البدْء في تحريره: touch ~/bin/filebackup chmod +x ~/bin/filebackup nano ~/bin/filebackupينبغي الانتباه إلى أنّ أي سطر يبدأ بعلامة # تعليق، أي أنّه لن يؤثّر على عمل السكربت إلا إذا أُتبعت # بعلامة تعجّب ! في السّطر الأوّل من برنامجك؛ في هذه الحالة يُطلق عليها اسم shebang والّتي شرحنا سابقًا أنّ نظام التّشغيل يعرف عن طريقها أنّ هذا الملفّ سكربت Shell ويُنفّذ الأوامر الموجودة فيه. يأخذ السكربت الشّكلَ التّالي: #!/bin/sh #Backup script #Description: makes a copy of any given file at the backup folder #Author: Your Name #Date: 8/10/2013 #Backup folder; set this variable to any folder you have write permissions on BACKUPFOLDER=~/backup #The script will make sure the folder exists mkdir -p $BACKUPFOLDER #Now the script will copy the given file to the folder cp -a $@ $BACKUPFOLDERنشرح، بعد حفظ الملفّ (CTRL+O) والخروج من محرّر النّصوص (CTRL+X)، عمل السكربت. الأسطُر الأولى كلّها تعليقات؛ عرّفنا بعدها متغيّرًا باسم BACKUPFOLDER نضع فيه مسار المجلّد حيث نُريد نسخ الملفّات. ننفّذ بعدها الأمر mkdir -p $BACKUPFOLDER الّذي يُنشئ مجلّدًا في المسار الموجود في المتغيّر BACKUPFOLDER، إذا كان المجلّد موجودًا مسبقًا لن تظهر أي رسالة خطأ نظرًا لاستخدام خيّار p-. تدلّ علامة @$ في الأمر التّالي، cp، على المعطيات الّتي يمرّرها المستخدِم أثناء تنفيذ السّكربت. لتمرير المعطيات للسكربت فإنّ المستخدِم يكتبها مباشرةً بعد اسم السكربت. يوجد مجلّد الحفظ (وِجهة النّسخ، في هذه الحالة قيمة المتغيّر BACKUPFOLDER) مباشرةً بعد المعطيات الّتي يمرّرها المستخدِم. لتجربة السكربت نفّذ ما يلي، على اعتبار أنّ file1 وfile ملفّان يوجدان في المجلّد حيثُ تنفّذ السكربت: filebackup file1 fileيمكنك إضافة ملفّات بالعدد الّذي تريد، بكتابة أسمائها بعد اسم السكربت، وستُنقَل جميعها إلى مجلّد النّسخ الاحتيّاطيّ. أوامر أساسيّة في Shellتوجد بعض الأوامر الأساسيّة لعرض المعلومات للمستخدِم، ولأخذها منه أيضًا. 1- أمر echoيُستخدَم أمر echo لعرض معلومات للمستخدِم، سواءٌ كانت هذه المعلومات نصًّا أو متغيّرات أو خليطًا من الاثنين. يُمكن استخدام الخيّاريْن n- وe- مع أمر echo؛ يمنع خيّار n- طباعة سطر جديد بعد النّصّ المعروض، أما خيّار e- فيُفعّل استخدام مجموعة الرموز التّالية داخل النّصّ: a\: صوت تحذير - Alert soundb\: فراغ للخلف Backspacec\: لا تطبع سطرًا جديدًاe\: مِحرف الخلوص Escape charactern\: سطر جديدr\: رجوع إلى السّطرt\: جدولة أفقيّة0xx\: محرف ASCII\\: خط مائل عكسي Backslash.على سبيل المثال، يؤدّي الأمران التّاليّان نفس الشّيئ بالضّبط (لاحِظ وجود النّص بين علامتيْ اقتباس): echo -e “Text\c” echo -n “Text”لعرض قيمة متغيّر عن طريق أمر echo أضف اسم المتغيّر مسبوقًا بعلامة $: string=World! echo "Hello $string"يُمكنك خلط نص، أوامر ومتغيّرات في سلسلة محارف String واحدة. يمكنك أيضًا كتابة أمر من سطر واحد يعرض نصًّا من أسطر عديدة؛ كلّ ما عليك فعله هو كتابة n\ في المكان الّذي تُريد بدْءَ سطرٍ جديد منه. 2- تهيئة النّصوص باستخدام أمر echoيُمكن لأمر echo عرض النّصوص وتهيئتها بألوان وأساليب متنوّعة؛ ولكنّ نتائج هذه التّهيئة قد لا تكون دومًا متشابهة في الطّرفيّات الموجودة. يجب الانتباه إلى أنّ بعض المستخدمين قد لا يرون نتيجة تهيئة النّصوص بنفس الطّريقة الّتي تظهر لديك. لا يُشكّل هذا الأمر، بما أنّ التّغيير ظاهريّ أساسًا، مشكلًا كبيرًا في غالب الأوقات. يُعرَّف كلُّ تخصيص (جعل الخطّ عريضًا Bold، وضع خطّ تحت النّص، أو تلوينه) بمتتاليّة من محارف الخلوص Escape characters، وهي مجموعة من الرّموز تتبع المِحرف `e\’، على النّحو التّالي: echo -e "This is \e[1mBold"ينتُج عن الأمر السّابق كتابة الجملة This is Bold مع تمييز كلمة Bold بخط عريض. يوضّح الجدول التّالي بعض الرّموز شائعة الاستخدام: خطّ عريضخطّ عاديّخطّ تحت النّصّعكس الألوانe[1m\e[2m\e[4m\e[7m\ يُمكن استخدام هذه الرّموز معًا للحصول على نصّ عريض ومخطوط تحته، ثمّ إعادة تعيين التّأثيرات باستخدام الرّمز e[0m\: echo -e "\e[4mThis \e[1mis\e[0m \e[7man example \e[0mstring"جرّب الأمر وشاهد عمل الرّموز. يعمل تلوين النّصوص بنفس الطّريقة حيثُ يوجد رمز لكلّ لون. تُدرج رموز الألوان مثل ما تُدرج رموز تهيئة النّص المذكورة في الفقرة السّابقة. يوضّح الجدول التّالي رموز الألوان الأكثر شيوعًا. يوجد رمز للون النّص وآخر لخلفيّته. أسودe[30m\e[40m\أحمرe[31m\e[41m\أخضرe[32m\e[42m\أصفرe[33m\e[43m\أزرقe[34m\e[44m\أرجوانيّe[35m\e[45m\سماويّe[36m\e[46m\رمادي فاتحe[37m\e[47m\اللّون الافتراضيّe[39m\e[49m\إن أردنا مثلًا نصًّا بلون أحمر فالرّمز هوe[31m\، أمّا إذا أردنا خلفيّة بلون أحمر فالرّمز هو e[41m\. يُمكنك استخدام ألوان مختلفة لكلّ من النّص والخلفيّة، كما أنّ بإمكانك استخدام رموز تهيئة النّصّ المذكورة في الفقرة السّابقة إلى جانب رموز ألوان النّصّ والخلفيّة. 3- أمر readيُستدعى أمر read لأخذ بيانات من المستخدِم. يسجّل أمر read كلّ ما يكتبه المستخدِم ابتداءً من استدعاء الأمر إلى أن يضغط على زرّ ENTER، يسجّله في متغيّر. يوجد معطًى واحد للاستخدام مع أمر read وهو اسم المتغيّر الّذي سيُحتفظ فيه بما يكتبه المستخدِم. في ما يلي مثال لسكربت مختصَر يُنشئ مجلّدًا بالاسم الّذي يختاره المستخدِم: #!/bin/bash read foldername mkdir foldernameيُمكن ملاحظة أنّ السكربت السّابق لا يمتلك أيّ واجهة للتّفاعل مع المستخدم. كيف يُمكن للمستخدِم أن يعرف مالّذي عليه كتابته؟ 4- مثال على سكربتسنطبّق، عبر المثال التّالي، كلّ ما تعلّمناه حتى الآن. سنعرِض رسائل مخصَّصة ومنسَّقة للمستخدِم، ثمّ نأخذ منه البيانات الّتي نحتاجها. عرضنا في بداية هذا الشّرح مثالًا لسكربت ينسخ احتيّاطيًّا مجموعة من الملفّات؛ سنعيد كتابة هذا السّكربت لنطلُب من المستخدِم مالملفّات الّتي يُريد نسخَها. نعدّ بدايةً الملفّ ونفتحه للتّحرير: touch ~/bin/filebackup2 chmod +x ~/bin/filebackup2 nano ~/bin/filebackup2ونُعيد كتابته بحيث تكون لديه واجهة مع المستخدِم: #!/bin/bash #Backup script 2.0 #Description: makes a copy of any given file at the backup folder #Author: Your Name #Date: 5/27/2015 #Request the backup folder from the user: echo -e "\e[1m\e[32mFile Backup Utility\n\e[39m\e[0mPlease input your backup folder:" read BACKUPFOLDER #The script will make sure the folder exists mkdir -p $BACKUPFOLDER #Request files to be backed up: echo -e "\e[47m\e[30mWhich files do you want backed up?\e[39m\e[49m" read FILES cp -a $FILES $BACKUPFOLDERيُظهر السكربت رسالة للمستخدِم، بطريقة منسَّقة، تدعوه أوّلًا لإدخال اسم المجلّد الّذي ستُحفَظ فيه النّسخ الاحتيّاطيّة ويحتفظ باسم المجلّد في المتغيّر BACKUPFOLDER، ثمّ يُنشئ السكربت المجلّد إن لم يكن موجودًا. الخطوة التّاليّة هيّ إظهار رسالة تطلُب من المستخدم إدراج أسماء الملفّات المُراد نسخُها ويحفظها في متغيّر باسم FILES. الخطوة الأخيرة هي نسخ الملفّات إلى المجلّد عبر الأمر cp. غطّينا في الفقرات السّابقة الأوامر الأساسيّة الّتي تُمكِّن من كتابة سكربتات تتفاعل مع المستخدِم حتّى يعلم بالضّبط كيف يعمل السكربت ومالمعلومات الّتي يطلُبها. ليست كلّ السكربتات تحتاج إلى واجهة مستخدِم؛ السكربت الأوّل الّذي كتبناه أسرع من الثّاني وأفضل في كثير من الأحيان. لا تُضِف واجهة استخدام إلّا للسكربتات الّتي يحتاج المستخدِم للمساعدة في استخدامها، في هذه الحالة ستحتاج لأمر echo. التّعليمات الشّرطيّة Conditional statementsتُعدّ التّعليمات الشّرطيّة من الأمور الّتي لا غنى عنها لأيّ لغة برمجة متكاملة. سنتطرّق في هذا الجزء من الدّرس لطريقة وضع شروط وتنفيذ أوامر عند تحقّق - أو عدم تحقّق - هذه الشّروط. 1- أمر ifتُستخدَم التّعليمات الشّرطيّة لوضع شروط تُنفَّذ عند تحقّقها إجراءات معيّنة. يوجد في Shell أمر if الّذي يُتبَع بعبارة ستُختَبَر صحّتها. يُمكن لهذا العبارة أن تكون عبارة منطقيّة، رمز خروج Exit code لأمر أو بعض الأمور الأخرى. عند العمل على رموز الخروج من أوامر فإن استخدامَها مباشِر: if ls folder then echo "Folder exists" fiإذا وُجد ملفّ باسم folder فإنّ السّكربت السّابق سيُنفّذ الأمر echo "Folder exists" لأنّ رمز الخروج من أمر ls في هذه الحالة هو 0 (يُشير الرّمز 0 إلى أنّه لا توجد أخطاء في تنفيذ الأمر). أمّا إذا لم يوجد المجلَّد فلن تُعرَض الرّسالة. يجب أن تتبع كلَّ تعليمة if بthen ,وتُختَم بfi. إذا أردت التّعامل مع عبارات منطقيّة في تعليمة if فستحتاج لأمر test. توجد في Shell العوامل Operators التّاليّة لمقارنة الأعداد: eq-: يُساويne-: لا يُساويlt-: أصغر منle-: أصغر من أو يُساويgt-: أكبر منge-: أكبر من أو يُساويتوجد طريقتان لكتابة أمر test: if test 4 -gt 3أو: if [ 4 -gt 3]تؤدّي الكتابتان نفس العمل تمامًا، كما أنّهما تحتاجان أيضًا لthen وfi. مثال: if [ 20 -lt 10 ] then echo "What?" fiإذا جرّبت تنفيذ السكربت السّابق فستُلاحِظ ألّا شيءَ يُعرَض على الشّاشة؛ لأنّ الشّرط غير متحقّق، فالعدد 20 ليس أصغر من 10. ماذا لو أردنا عرض رسالة للزّائر في حال عدم تحقّق الشرط، مثل ماهو الحال في المثال السّابق؟ 2- أمر elseتُضيف else بديلًا يُنفَّذ عند عدم تحقّق الشّرط في تعليمة if. طريقة الاستخدام: if [ 20 -lt 10 ] then echo "What?" else echo "No, 20 is greater than 10." fiفي هذا المثال نتحقّق من شرط “20 أصغر من 10”، في حال كان صحيحًا نطبع كلمة “?What”، أمّا إذا لم يكن صحيحًا فنطبع عبارة “No, 20 is greater than 10.” (أي لا، 20 أكبر من 10). يُمكن، إلى جانب العبارات المنطقيّة، مفارنة سلسلة محارف ضمن تعليمة if/else. تتطلّب مقارنة المحارف صيغةً مختلفة قليلًا عن مقارنة الأعداد، ولكنّها تسخدم أمر test أيضًا. في ما يلي صيغة مقارنة سلسلة محارِف: string = string: تكون العبارة صحيحة عندما تكون السّلسلتان متساويّتيْنstring != string: تكون العبارة صحيحة عندما لا تكون السّلسلتان متساويّتيْن.string: سلسلة غير خاويّة أو غير معرَّفةn string-: سلسلة معرَّفة وغير خاويّةz string-: سلسلة معرَّفة وغير خاويّةتوجد أيضًا طُرُق لاختبار خصائص الملفّات: s file-: تكون العبارة صحيحة إذا كان الملفّ file غير فارغ.f file-: عبارة صحيحة إذا كان الملفّ file موجودًا وليسd folder-: العبارة صحيحة إذا كان folder مجلّدًا وليس ملفًّا.w file-: عبارة صحيحة إذا كان يُمكن الكتابة في الملف filer file-: يتحقّق الشّرط عندما يكون الملفّ file للقراءة فقط.x file-: تختبر هل الملفّ قابل للتّنفيذ.3- تعليمات if متداخلة Nested if’sيُمكن كتابة تعليمة if كاملة ضمن تعليمة if أخرى، في ما يُعرف بتعليمات if متداخلة. نتعرّف على عمل بتعليمات if المتداخلة في المثال التّالي بالاستعانة بأمر read: #!/bin/bash echo "Input which file you want created" read file if [ -f $file ] then echo "The file already exists" else touch $file if [ -w $file ] then echo "The file was created and is writable" else echo "The file was created but isn't writable" fi fiيطلُبُ السكربت من المستخدِم إدخال اسم ملفّ ليُنشئه، ويخزّن اسم الملفّ في المتغيّر file؛ ثمّ يختبر إن كان الملفّ موجودًا f $file-، ويُظهر رسالة بذلك إن كانت نتيجة التّحقّق إيجابيّة وإلّا يُنشئ الملفّ (touch $file). بعد إنشاء الملفّ يختبر هل يُمكن الكتابة عليه (w $file-) وإذا كانت الإجابة نعم يطبع الرّسالة The file was created and is writable وإلّا يطبع رسالة مغايِرة The file was created but isn't writable. 4- مثال على سكربتنُكمل مع سكربت النّسخ الاحتيّاطي لتحسينه. تتضمّن هذه النّسخة اختبارًا لمعرفة ما إذا كان مجلّد النّسخ موجودًا (d $BACKUPFOLDER-) وما إذا كان لدى المستخدِم امتيّاز Privilege إنشاء مجلّد. نبدأ بإنشاء السّكربت وإعداده: touch ~/bin/filebackup3 chmod +x ~/bin/filebackup3 nano ~/bin/filebackup3ثمّ تحريره: #!/bin/bash #Backup script 3.0 #Description: makes a copy of any given file at the backup folder #Author: Your Name #Date: 9/29/2013 #Request the backup folder from the user: echo -e "\e[47m\e[1m\e[32mFile Backup Utility\n\e[39m\e[0m\e[47mPlease input your backup folder:" read BACKUPFOLDER #The script will make sure the folder exists if [ -d $BACKUPFOLDER ] then echo "You backup folder exists and will be used." else mkdir $BACKUPFOLDER if [ -d $BACKUPFOLDER ] then echo "Backup folder created successfully." else echo -e "I do not have the rights to create your backup folder.\nThis script will now exit." exit 1 #exit 1 is a command that exits the script with an error code fi fi #Request files to be backed up: echo -e "\e[30mWhich files do you want backed up?\e[39m\e[49m" read FILES if [ -n $FILES ] then cp -a $FILES $BACKUPFOLDER else echo "File does not exist." fiلاحِظ أمر exit الّذي يُستخدَم لإيقاف السّكربت مع رمز خطأ. يعرض السّكربت رسالة عندما لا يوجد مجلّد للنّسخ الاحتيّاطيّ، عند إنشائه، إن لم يكن بالإمكان إنشاؤه، وعند كتابة سلسلة محارف خاويّة لأسماء الملفّات. خاتمةيضع هذا الدّرس اللّبنات الأساسيّة الّتي تمكّن من كتابة سكربتات Shell يُمكن للمستخدِم التّفاعل معها. لا زال هناك الكثير لتعلّمه من أجل كتابة برامج Shell بإمكانيّات أكبر وحلول أكثر إبداعًا، إلّا أنّ إتقان المحتوى الموجود هنا خطوة أولى في الطّريق. ترجمة بتصرّف لسلسلة مقالات An Introduction to Shell Scripting