أساسيات التعامل مع الصدفة Shell في Red Hat Enterprise Linux


محمد أحمد العيل

يعالج هذا الدرس، الأول من سلسلة دروس عن شهادة RHCSA، أساسيّات التعامل مع الطرفيّة Terminal في RHEL. سنفترض أن لديك توزيعة RHEL 7 مثبّتة وجاهزة للعمل؛ يمكنك الاستعانة بدرس تثبيت Red Hat Enterprise Linux باستخدام VirtualBox لتجهيز بيئة للعمل عليها.

redhat-rhcsa-shell-commands.png

بنية الأوامر في 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.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن