4.2 عودة إلى سطر الأوامر كتاب لينكس الشامل >>

4.2 عودة إلى سطر الأوامر

الفهرس

4.2.1 التعامل مع الملفات

تحدثنا عن فتح دليل باستخدام mkdir وحذف دليل فارغ باستعمال rmdir ونسخ ونقل (أو تغير اسم) و حذف cp و mv و rm على الترتيب في فصل سطر الأوامر ليس مخيفاً ولكننا لم نعط أمثلة على ذلك، هذه بعض الأمثلة لنفرض أن لديك ملف اسمه test.txt موجود على سطح المكتب

bash$ pwd
 /home/ahmad
bash$ ls Desktop/*.txt
 test.txt
bash$ mv Desktop/*.txt ./
bash$ ls *.txt
 test.txt
bash$ ls Desktop/*.txt
 not found
bash$ mv test.txt temp.txt
bash$ ls *.txt
 temp.txt
bash$ rm -i *.txt
 remove temp.txt [yn] ? y

tipتلميح

تذكر . تعني الدليل الحالي و .. الدليل الأب و - الدليل السابق ~ الدليل البيت

bash$ pwd
 /home/ahmad
bash$ mkdir test1 test2
bash$ ls -F
 Desktop/ test1/ test2/ oldfile link@ exec.sh*
bash$ cd test1
bash$ rmdir ~/test1
 busy
bash$ echo "file one" > test1.txt
bash$ less test1.txt
bash$ cp -vi test1.txt test2.txt
 test1.txt -> test2.txt
bash$ cp -vi test2.txt test1.txt
 overwrite test1.txt [yn] ? y
 test2.txt -> test1.txt
bash$ ls *.txt
 test1.txt test2.txt
bash$ cd ..
bash$ rm -R test1

warningتحذير

وضعك لمسافة خطأ وأنت جذر قد يؤدي لنتيجة كارثية انظر هذا المثال rm -R test1/test2 إذا كتبته rm -R test1 / test2 فهذا يعني حذف test1 وكل شيء و test2

لمعرفة أي البرامج تنفذ عند طباعة أمر معين اكتب which ثم اسم البرنامج مثلاً which lilo قد تعطيك /sbin/lilo ونستخدمه عندما يكون هناك أكثر من برنامج بنفس الاسم لمعرفة أيها ينفذ، للبحث عن ملفات تنفيذية أو كتيبات أو مكتبات استعمل whereis متبوعاً باسم الملف دون سوابق أو لواحق حيث يقوم بالبحث في مجلدات محددة فقط ،مثلاً

bash$ whereis lilo
/sbin/lilo
/usr/share/man/man8/lilo.8.gz
/usr/share/man/man5/lilo.conf.5.gz
وللبحث عن ملف بسرعة باستعمال جداول تذكر(لتسريع عملية البحث) يمكن استعمال locate متبوعاً بنموذج الملف الذي تبحث عنه PATTERN التي يمكن أن تحتوي على * أو ? وغيرها (تأكد من وضعها داخل إقتباس قوي لكي لا يعبث بها باش) وإذا رغبت في إهمال حالة الحروف الإنجليزية (إن كبيرة أو صغيرة) أضف الخيار -i أي --ignore-case ولتحديد مكان البحث إن ردت باستعمال الخيار -d متبوعاً بالمجلد الذي تريد مثلاً
bash$ locate '*lilo*'
/sbin/lilo
/etc/lilo.conf
/usr/share/man/man8/lilo.8.gz
/usr/share/man/man5/lilo.conf.5.gz
/usr/share/doc/Lilo-Doc/lilo-readme.html
/home/ahmad/using lilo.html
bash$ locate *.swp -i -d /mnt/win_c
/mnt/win_c/windows/win386.swp
ولكن هذه الأداة تجدد معلوماتها بين فترة وأخرى وقد تعطيك نتيجة غير دقيقة ولكنها تصلح للبحث عن ملفات موجودة مع النظام وبسرعة عالية. يتم تحديث قاعدة بياناتها بواسطة الأداة updatedb وقد تضعها توزيعتك لتعمل في فترات محددة يومي أو اسبوعي ... بواسطة cron مثلاً في دبيان يومي. متغيرا البيئة PRUNEFS و PRUNEPATHES يحددان أنظمة الملفات و المسارات التي لا تدخل في الحسبان يفصل بينها مسافات، لتعديلها لمرة واحدة استعمل ما يشبه
bash# export PRUNEPATHES="/mnt /tmp /proc $PRUNEPATHES"
bash# updatedb
أو دائم بتعديل ملف cron أو ما شابه.

أما عمليات البحث عن ملفات المباشرة من القرص(دون استخدام جداول) تتم باستعمال find متبوعاً بالدليل الذي تريد أن تبحث فيه متبوعاً ببعض محددات البحث مثل اسم الملف -name PAT أو وقت آخر تعديل فيه بالأيام -mtime DAYS أو وقت آخر تعديل لحالته (أذوناته مثلاً) -ctime DAYS أو وقت آخر وصول له(قراءة مثلاً) -atime DAYS وإذا أردت تطبيق شيء عليها استعمل الخيار -exec 'COMMAND {} ;' حيث سيتم استبدال {} باسم الملف الذي وجده مثلاً find ~/tmp/ -atime 3 -exec 'rm {} ;' تبحث عن جميع الملفات في ~/tmp/ التي لم يتم لمسها من 3 أيام وتحذفها.

هناك الكثير من خواص الملفات يمكن تغييرها بالأوامر التالية

chown USER[:GROUP] FILE لتغيير مالك الملف
chgrp GROUP FILE لتغيير المجموعة المالكة للملف
chmod MODE FILE لتغيير أذونات(تراخيص) الملف

قلنا قبلا أن أذونات(تراخيص) الملف يمكن أن تكون بالسماح بتنفيذ ذلك الملف(للإختصار x) أو الكتابة فيه(للإختصار w) أو قراءته(للإختصار r) وهذه التراخيص يتحكم بها بأمر chmod مثلا chmod +x file1 تجعل الملف قابل للتنفيذ chmod -x file1 تمنع تنفيذ الملف، وهناك طريقة مفضلة أكثر هي استخدام التمثيل الرقمي الثماني(0-7) بدل rwx حيث نعطي x واحد و w اثنان و r أربعة ويكون الرقم الناتج من جمع(بالعلاقة المنطقية أو) الأذونات التي نريد لمالك الملف هي الخانة الأولى من اليسار (المئات في العشري) ورقم آخر بنفس الطريقة للمجموعة يكون الخانة الوسطى وأما الآحاد لغير ذلك فمثلا إذا أراد المالك أن يقرأ ويكتب وينفذ 4+2+1=7 والمجموعة تقرأ وتنفذ 1+4=5 وغيرهم لا يستطيعون شيء 0 فيكون الأمر chmod 750 file1 إن الأمر أسهل مما يبدو ويمكنك تغيير أذونات مجلد وكافة الملفات الفرعية باستعمال الخيار R مثلا chmod -R 750 myfolder وعلامة sticky هي 1 من منزلة عشرات الألوف (لو أنه نظام عشري) مثلاً chmod 1755 file1 وهناك اذونات أخرى نشرحها لاحقاً

4.2.2 التعامل مع أنظمة الملفات

تحدثنا في درس العتاد عن أمر mount لضم أنظمة الملفات إلى نظام لينكس وقلنا أن هذه العملية ليست عمليت نقل لتلك الملفات وإنما عملية وهمية يظهر فيها دليل فارغ(ليس بالضرورفة أن يكون فارغ ولكن محتوياته السابقة تختفي) وكأنه يحتوي ملفات ذلك الجهاز، و أمر umount الذي يلغي تلك العملية وما ستعرفه الآن أن هذا الأمر ليس فقط للأجهزة الحقيقية فقط بل أيضا لأجهزة افتراضية أيضا مثل proc التي تحدثنا عنها في درس تنظيم الملفات وهي عبارة عن معلومات تعرفها النواة فتخبرنا بها على شكل ملفات مثل cpuinfo و uptime و loadavg و mounts و filesystems وقلنا أن هذا وغيره يتم تحميله تلقاياً عند الإقلاع والذي يحدد ذلك هو ملف /etc/fstab الذي يتم قراءته عند الإقلاع ونظام الملفات المذكور في هذا الجدول لست مضطرا لذكر تفاصيل عند ضمه فقط اكتب mount ثم الجهاز أو الدليل واذا كنت تريد أن يتم اضافة قرص قابل للنزع هناك مثل القرص المرن والمدمج ولكن لاتريد أن يتم ذلك تلقائيا عند الإقلاع نستعمل الخيار noauto وهناك ملاحظة جميلة أنه إذا ضممت القرص المدمج فإنه لن يخرج بالضغط على زر eject حتى تلغي ضمه بأمر umount وهناك ما هو أجمل أن أمر الضم mount يغلق باب سواقة الأقراص المدمجة تلقائيا

bash$ cat /proc/cpuinfo
 ..you see it yourself
bash$ mount
 ..tells yo what is mounted now
bash$ man mount
 ..tells about mount
bash$ man fstab
 ..tells about after boot mount table
bash$ cat /etc/fstab

أمر eject يعمل umount و يفتح باب السواقة!! والجميل أنه بدون معاملات يفتح القرص المدمج الأول ويمكنك أن تطلب منه القرص المدمج الثاني بذكر اسم الجهاز مع أو بلا /dev

# جرب هذه المزحة
bash$ eject ; mount /mnt/cdrom ; eject ; mount /mnt/cdrom
# أو هذه المزحة وانتظر دقيقة
bash$ { sleep 60; eject } &

إذا حصلت على رسالة تقول أن الجهاز مشغول فهذا إما لأنك موجود في المجلد الذي يخصه أو لأن هناك برنامج يكتب أو يقرأ منه أو لأنك ضممت جهاز داخل أحد مجلداته (وهذا الخطأ شائع عند تنفيذ chroot)

bash$ pwd
/mnt/floppy
bash$ umount floppy
umount: device is besy

هل لديك توزيعتان؟ أو ربما أنت في توزيعة إنقذ على قرص مرن أو قرص مدمج حي Live-CD وتريد تنفيذ برنامج من التوزيعة الأخرى المركّبة على القرص الصلب. مثلاً واحدة في / وأخرى /mnt/linux/ بعد ضمها. جرب تشغيل /mnt/linux/usr/games/gnuchess؛ على ماذا حصلت ؟ قد لا تعمل بسبب عدم وجود مكتبة أو تضرب الإصدرات أو ربما ملفات مفقودة فالبرامج تتوقع أن تكون ملفاته في /usr/share وليس /mnt/linux/usr/share ما العمل ؟ قد لا يبدو الأمر ضرورياً لهذه الدرجة ولكن إذا كنت أتحدث عن إعادة lilo من قرص الإنقاذ أصبح هناك فائدة تستحق الذكر. ما نريده هو تغيير الدليل الجذر من / إلى /mnt/linux بشكل وهمي دون نقل ملفات chroot أي change root وهي تحول الدليل الجذري بشكل وهمي في ذلك البرنامج دون التأثير على البرامج الأخرى وهذا البرنامج يأخذ معامل هو الدليل المطلوب مثلاً chroot /mnt/linux سيحاول الأمر هكذا تنفيذ /bin/sh من البيئة الجديدة وتظل فيها حتى ينتهي تنفيذ البرنامج sh بكتابة exit لهذا يجب أن تحتوي البيئة الجديدة برنامج sh وكامل لوازمه

# ls -F
bin/	sbin/	etc/	mnt/	lib/	tmp/
# mount /dev/hda5 /mnt/linux
# chroot /mnt/linux
sh# ls -F
bin/	sbin/	etc/	mnt/	lib/	usr/
tmp/	var/
sh# lilo -vv
sh# exit
# 
ويمكنك تشغيل أي برنامج آخر وذلك بكتابة اسمه(في البيئة الجديدة) بعد اسم الدليل
# ls /mnt/linux/usr/games/
fortune		gnuchess
# /mnt/linux/usr/games/fortune
file not found
# chroot /mnt/linux /usr/games/fortune
Error float point unit overflow
# 
هنا نفذنا البرنامج /mnt/linux/usr/games/fortune من البيئة الجديدة لاحظ أننا حصلنا على "خلل سبب فيضان في معالج الفاصلة العائمة" لا تدعه يخدك انه برنامج fortune يقوم ببعض المزاح والنكت

4.2.3 التعامل مع الأرشيف

أكثر طرق الضغط شيوعاً هي gzip لأنها طريقة سريعة وفعالة التي تضغط ملف واحد وتضيف له الاحقة .gz (الملف الأصلي سيختفي ويظهر الملف المضغوط) وتفك ضغط الملف عن طريق الخيار d أي decompress أو الأمر gunzip وعن الضغط يمكنك تمرير رقم يمثل مقدار الضغط من 1-9 حيث 9 أكبر ضغط وأبطئ سرعة. وهناك برنامج bzip2 وهي طريقة حديثة وتضغط بشكل أكبر وأقل سرعة وتأخذ خيارات مشابهة لسابقه. ويمكنهما أن يضغطا الدخل الإفتراضي أو يرسلا ناتج الفك إلى جهاز الإخراج الأفتراضي.

tipتلميح

تعطي طريقة الأرشفة ثم الضغط(الضغط العام) فاعلية أكبر من مثيلاتها أي الضغط ثم الأرشفة(المستخدمة في winzip) لأنها لأنها تضع علاقات بين أكثر من ملف مثلا نواة لينكس ذات ال 200 ميغا ربما تصبح 7 ميغا بعد الضغط بطريقة bz2

bash$  ls -lh delme.* 
-rw-r--r-- 1	ali users	 1M May 28 19:20 delme.bmp
bash$  gzip -9 delme.bmp 
bash$  ls -lh delme.* 
-rw-r--r-- 1	ali users	12K May 28 19:20 delme.bmp.gz
# notice that no delme.bmp
bash$  gzip -d delme.bmp.gz 
bash$  ls -lh delme.* 
-rw-r--r-- 1	ali users	 1M May 28 19:20 delme.bmp
bash$  gzip -9 < delme.bmp > delme.bmp.gz 
bash$  ls -lh delme.* 
-rw-r--r-- 1	ali users	 1M May 28 19:20 delme.bmp
-rw-r--r-- 1	ali users	12K May 28 19:20 delme.bmp.gz
# notice that the delme.bmp is not deleted
bash$  bzip2 -9 < delme.bmp > delme.bmp.bz2 
bash$  ls -lh delme.* 
-rw-r--r-- 1	ali users	 1M May 28 19:20 delme.bmp
-rw-r--r-- 1	ali users	12K May 28 19:20 delme.bmp.gz
-rw-r--r-- 1	ali users	 9K May 28 19:20 delme.bmp.bz2

ولكن هذه لاتشكل أرشيف أما أهم طريقة للأرشفة في لينكس هي tar وتعني أرشيف الشريط وهذا الاسم له مدلول تاريخي فقط! فهو الآن ليس أرشيف على شريط لفك الملفات من الأرشيف أستعمل الخيار x الذي يعني extrcat أي فك مع الخيارات الأخرى ولعمل أرشيف استخدم الخيار c أي create ويمكنك استعراض محتويات ارشيف باستعمال الخيار t ، واستخدم الخيار p للحفاظ على حالة الملفات (إذا كانت أجهزة أو وصلات) ، ولتحديد اسم الأرشيف استخدم الخيار f أي file واذا كان الملف هو الدخل/الخرج الإفتراضي ضع - وهذا الأرشيف غير مضغوط ولضغطه نستخدم gzip أو bzip2

bash$  ls 
 delme.tar.bz2
bash$  bzip2 -d delme.tar.bz2 | tar -xvf -  
# قمنا بفك ضغط ثم بحل الأرشيف
bash$  ls 
 delme1.bmp  delme2.bmp  delme3.bmp delme.tar.bz2
bash$  rm *.tar* && ls
 delme1.bmp  delme2.bmp  delme3.bmp
# لأرشفة كل الملفات غير المخفية وضغطها
bash$  tar -cvf - * | gzip -9 > delme.tar.gz 
bash$  ls 
 delme1.bmp  delme2.bmp  delme3.bmp delme.tar.gz

برنامج tar من جنو مزود بخيار j يمكنه من ضغط وفك بطريقة bzip2 وخيار z لطريقة gzip لذا يمكن استعمال

 tar -cvzf delme.tar.gz *
بدلا من tar -cvf - * | gzip -9 > delme.tar.gz واستعمال
tar -xjvf delme.tar.bz2  
مكان bzip2 -d delme.tar.bz2 | tar -xvf - ولإستعراض محتويات أرشيف يمكنك tar -tvzf delme.tar.gz واذا أردت فك الأرشيف في مكان غير الدليل الحالي استعمل الخيار C ثم اسم الدليل يصبح الأمر
tar -xjvf delme.tar.bz2 -C /mynew/dir 
وهناك خيارات أخرى لإضافة وحدف ملف واحد من وإلى الأرشيف أو تحديث الأرشيف لا مجال لذكرها عد إلى دليل الإستخدام man tar

tipتلميح

ملاحذة ال * (وأيضا ؟) لا تشمل الملفات المخفية التي تبدأ بنقطة "." وهذا جيد لتجاهل الملفات المؤقتة (أو النسخ الإحتياطية) وملفات الإعدادات والملفات التي ينشرها مدير الملفات ، اذا كنت تريد اضافة الملفات المخفية اكتب المجلد فيأخذ كل شيء بداخله يعني اكتب tar -cvzf delme.tar.gz ./

tipتلميح

عند عمل أرشيف من مجلد بأمر
tar -cvzf delme.tar.gz ./ ستوضع الملفات مباشرة ولكن تنفيذ الأمر
tar -cvzf delme.tar.gz myfolder/ من المجلد الأب سيكون أرشيف عبارة عن مجلد myfolder وبه الملفات ويمكن تمرير أكثر من مجلد وملف ليتم أرشفتها مثلاً
tar -cvzf delme.tar.gz myfile1.txt myfolder1/ myfolder2/

وهناك أدوات أخرى ليس جزأ من GNU/Linux ولكنها تأتي مع بعض التوزيعات مثل unarc, unarj, unrar, zip,unzip,cabextract مثلا لفك ضغط ملف .zip في الدليل الحالي

unzip /path/to/file.zip

يمكن تقسيم الملف إلى ملفات أصغر بحجم محدد (مثلاً لوضعها على عدة أقراص)، وذلك بواسطة split ثم دمجها معاً مرة أخرى بواسطة cat. هناك عدة أدوات تولد رقم فريد لكل ملف يتغيّر بتغيير أي بايت ويستخدم لمعرفة هل تعدل الملف (بسبب خلل في النقل مثلاً) ، وذلك بمقارنة الرقمين قبل وبعد النقل منها sum و chksum و md5sum والأخيرة هي الأقوى. لمقارنة ملفين نستعمل comm التي تقارن سطراً فسطر بطريقة غبية أو الأداة diff التي تستطيع تعرف إضافة سطر واحد في بداية الملف (الأدوات الأخرى ستظن أن كل الأسطر بعده مختلفة).

4.2.4 التعامل مع العمليات(المهام)

كل برنامج تنفذه يسمى عملية process يمكن أن ينفذ برنامج آخر (يسمى العملية الإبن child-process)فإذا نفذت برنامج وأنت جذر فإن البرنامج الإبن يكتسب حقوق الجذر. فإذا أغلقت البرنامج الأب ينتهي معه البرنامج الإبن وأيضا عند عمل أنبوب بين برنامجين يعتبر المرسل أباً والآخر إبناً مثلاً عند تشغيل برنامج tar الذي بدوره يشغل gzip لهذا تكون هذه الخاصية جيدة لأنك إذا أغلقت برنامج tar ما الفائدة من وجود برنامج gzip الذي مهمته أن يستقبل معلومات من tar ويضغطها؟! ولكن قد تصبح مزعجة جرب تشغيل برنامج رسومي من سطر الأوامر مثل gedit ثم اغلاق سطر الأوامر ولكن إذا أردت أن لا يغلق الإبن يمكنك استعمال أدآة nohup فإذا أغلقت البرنامج الأب لا يغلق الإبن بل يصبح يتيماً.

هناك الكثير من الأدوات تمكنك من التحكم في هذه العمليات وذلك بإنهاء العملية أو قتلها أو تصفيتها (يعني شغل عصابات) أو زيادة أولويتها أو تقليل أولويتها وغير ذلك ،يعطى لكل عملية رقم معرف يسمى PID لتسهل العمل الأمر ps يستعمل لمعرفة العمليات الجارية في التيرمينال التي أنت بها والرقم المقابل لكل واحدة يضاف له الخيار a لمعرفة كل العمليات الجارية وهناك خيارات أخرى مثل استعراض المستخدم الذي شغل كل مهمة .. إلخ وهناك أمر top (أخبرني صديق أنه يبدو أجمل في xterm) الذي يطبع قائمة محدثة تلقائيا عن العمليات الجارية ويعرض في المقدمة تلك التي تشغل موارد الجهاز أكثر وهو برنامج تفاعلي ينتظر أن تغلقه ب CTRL+C أو q .ويمكنك التحكم في العمليات (إيقافها أو زيادة/تقليل أولويتها) بضغطة زر البرنامج gnome-system-monitor برنامج ذو واجهة رسومية يقوم بعمل مشابه.

ولإغلاق أحد العمليات استعمل الأمر killall ثم اسم البرنامج ولتحديد كيفية عمل ذلك يمكنك تحديد الإشارة التي يجب ارسالها له مثل اشارة الإنهاء -TERM أو -15 أو اشارة القتل!! -KILL أو -9 تستخدم الأخيرة مع البرامج العنيدة بعد تجربة اشارة الإنهاء ويمكنك إذا أردت استعمال المعرف PID بدلا من الاسم استعمل kill ثم رقم المعرف من أمر ps أو استعمال برنامج pidof مثلاً kill -TERM `pidof wine` ثم kill -KILL `pidof wine` لقتل برنامج لا محاكي ويندوز. وسبب وجود هذه الأدوات ليس ماذكرناه فمن النادر أن يعلق برنامج ويضطرك إلا "قتله" ولكن الفائدة تكمن في إمكانية ارسال اشارات اخرى للبرامج مثل STOP و CONT لتوقيف البرنامج بشكل مؤقت ولمتابعة عمله بعد أن توقف وغيرها. وأهم استخدام لها يكون عند إغلاق الجهاز أو إعادة تشغيله حيث تقوم نصوص الإقلاع البرمجية booting scripts بإنهاء كل البرامج باستعمال kill لكي تتمكن من ازالة ضم الأقراص حتى لا يكون هناك برنامج يكتب على القرص أثناء ذلك مما يسبب device is besy ؛ فعدم ازالة الضم بشكل صحيح تتسبب في أن يتم فحص الأقراص عند الإقلاع

هناك أولويات في تنفيذ العمليات ويعبر عنها برقم من -20 إلى 19 و الأعلى أولوية هو الأكثر سالبية لتنفيذ برنامج بأولوية معينة استعمل الأمر nice ثم الأولوية ثم الأمر وللعلم الأولوية التلقائية هي 0 ولا يمكن للمستخدم العادي رفع الأولوية أكثر من ذلك فقط الجذر يمكنه ذلك ولتغيير أولوية برنامج قيد العمل renice ثم الأولوية الجديدة ثم رقم المعرف PID
killall [-SEGNAL] PROCNAME لقتل العملية (أو ارسال إشارة معينة) انظر kill
kill [-SEGNAL] PID لقتل العملية (أو ارسال إشارة معينة) انظر killall
nice PRIORTY COMMAND لتنفيذ برنامج بألوية معينة
renice PRIORTY PID لتغيير أولوية برنامج

يرتبط في أذهان الناس أن النظام متعدد المهام رسومي ولكن هذا غير صحيح. ففي الشاشة النصية في لينكس لديك أكثر من طرفية افتراضية VT تنتقل بينها ب CTRL+ALT+F1 و CTRL+ALT+F2... وهكذا. ولكن هذا ليس ما يجعل لينكس متعدد المهام فحتى في الطرفية الواحدة تستطيع تشغيل أكثر من برنامج. في الشاشة الرسومية تقوم بتصغير شاشة البرنامج الأول والإنتقال إلى آخر ، هذا ما نفعله في الشاشة النصية بضغط CTRL+Z بهذا يقوم لينكس بتعليق عمل البرنامج الذي ضغطنا فيه الزر. لنفرض أنك كنت تحرر نصوص بواسطة vim من سطر الأوامر وأردت تصنيف البرنامج الذي تحرره اضغط CTRL+Z ليختفي vim ويظهر سطر الأوامر من جديد وقد كتب

[1] 171 stoped		vim
bash$
7حيث [1] هو رقم الوظيفة job id و 171 هو رقم العملية PID اطبع الأمر الذي تريده الآن مثلاً make ثم لنفرض بعد أن انتهيت تذكرت أنك تريد نسخ ملفات بأمر cp وكانت ملفات كبيرة ونسيت أن تضع & في آخر الأمر أي أن عليك أن تنتظر حتى ينهي النسخ؛ لكن لا اضغط CTRL+Z يتم تعليق عملية النسخ وستحصل على
[2] 175 stoped		cp
bash$
اكتب الأمر jobs سيعرض لك العمليات التي علقتها لنجرب العودة ل vim اكتب الأمر fg %1 التي تعني foreground أي ضع البرنامج الذي له job id 1 في مقدمة الشاشة عندها سيظهر vim مرة أخرى (تشبه العملية شريط المهام taskbar فأنت تكبر نافذة وتصغر أخرى) لاحظ أن أمر النسخ معلق/متوقف ونحن لا نريد هذا مرة أخرى لنضغط CTRL+Z ليختفي vim . الآن لو أمرنا ب fg %2 سيعود برنامج النسخ على الشاشة (وهو عبارة عن شاشة فارغة لأننا لم نستعمل الخيار v) وعلينا أن ننتظر وهذا أيضاً ليس ما نريده. لهذا نستعمل bg %2 التي تجعل النسخ يتم في الخلفية foreground الآن لو كتبنا fg %1 نعود ل vim ولكن مع بقاء عمل cp في نفس الوقت. لاحظ لو أننا شغلنا cp مع الخيار v لكان من المستحيل العمل في vim بسبب ظهور رسائل تقول أن الملف الفلاني نسخ من .. إلى .. لهذا نراعي عند تشغيل برامج بالخلفية ب & أو bg أن نحول مخرجاتها إلى /dev/null أو إلى ملف لنراجعها فيما بعد أو حتى إلى طرفية أخرى /dev/ttyN
jobs لعرض العمليات الموجودة في الطرفية الحالية. الخيار l يمكن يعرض PID أيضاً.
bg %N لجعل العملية تعمل في الخلفية حيث N هو رقم job id
fg %N لجعل العملية تعمل في مقدمة الشاشة حيث N هو رقم job id
KILL %N يقتل العملية التي لها job id تساوي N

لمعرفة أي العمليات يستعمل ملفاً معيناً نستعمل الأداة fuser ونمرر لها اسم الملف(أو الملفات) وقد تفضل استعمال الخيار v لعرض يشبه ps مثلاً fuser -v myfile التي تعرض جدول بالصورة

FILE	USER	PID	ACCESS	COMMAND
حيث ACCESS هنا هي c أو e أو f أو r أو m أنها الدليل الحالي للبرنامج أو أن هذا البرنامج يستدعي (ينفذ) ذلك الملف ، أو يفتحه ، أو أنه الدليل البيت له، أو يشير له (في حالة mount أو ملفات المكتبات so) على الترتيب. الخيار m يفيد عندما لا تعني ملفاً بعينه بل كل فرع في ذلك الدليل أو الجهاز. تستطيع باستخدام الخيار k أن ترسل إشارة معينة (إشارة القتل هي التلقائية) لتلك العملية، تكون هذه مفيدة إذا أردت إلغاء ضم القرص المرن مثلاً وحصلت على أنه مشغول تستطيع أن تنهي كل البرامج التي تستعمله بالأمر fuser -km /mnt/floppy ستحصل على نصيحة بأن كل ما بقي عليك هو عملية umount. تستطيع هذه الأداة العمل على الشبكات وعرض ما يتصل بقنواة socket معينة مثلاً أن تعرض من يتصل على عنوان أو منفذ معين انظر فصل 5.2 العمل في الشبكات.

4.2.5 التعامل مع النصوص

كما لاحظنا يمكنك تحرير ملف دون الإستعانة بمحرر نصوص باستعمال cat أو يتوجيه الخرج انظر المثال

bash$  echo "create a file" > delme.txt 
bash$  echo "add this line to the end" >> delme.txt 
bash$  {echo "add this line at the top" ; cat delme.txt } > delme.txt 
bash$  cat delme.txt 
add this line at the top
create a file
add this line to the end
bash$  rm delme.txt 
bash$  cat <<EOF > delme.txt 
blah blah
blah
EOF
bash$  cat delme.txt 

يمكنك عرض أول كذا سطر من ملف باستعمال head وآخر كذا سطر باستعمال tail. وهناك أمر pr الذي يقوم بوضع هامش أيمن وأيسر بطريقة مرتبة pr -o 5 --width=70 FILE | less تعرض الملف بترك 5 مسافات من كل جهة كهامش(على فرض أن العرض 80). والأمر wc يذكر كم سطر وكم كلمة كم حرف في الملف. وهناك tr الذي يبدل الخيار الأول بالثاني مثلا لتحويل الأحرف الكبيرة إلى صغيرة tr A-Z a-z وهناك nl الذي يرقم الأسطر (ويهمل الأسطر الفارغة) وهناك sort التي ترتب أسطر الملف ،استعمل الخيار n للترتيب الرقمي (1 أكبر من 10 في الترتيب الأبجدي) و r لعكس الترتيب وهناك uniq التي تحذف الأسطر المكررة واذا أضفت الخيار c فإنها تقوم بوضع كم مرة تكرر السطر في بدايته (اضافة لحذف المكرر). ولكن هناك أشياء أكثر تعقيداً يمكنك أن تفعلها باستخدام هذه الأدوات grep و sed و awk و cut وهي أدوات معقدة نسبياً لذا يمكنك أن تقرأ عنها الآن بسرعة وتعود للتركيز ليها عند دراسة البرمجة باستخدام أوامر bash. مثلا grep يبحث عن الأسطر التي تحتوي ما تعطيه إياه في الملف الذي تعطيه إياه فاذا لم تحدد ملف قام بالعمل على الدخل القياسي ويطبع الأسطر المطابقة مثلاً grep vfat /etc/fstab تطبع الأسطر التي تحتوي vfat في ملف fstab وبكلمات أخرى تخبرك عن أقسام ويندوز.

tipتلميح

يمكن جعل grep غير حساس لحالة الحروف (إن كبيرة أو صغيرة) باستعمال الخيار -i مثلاً grep -i "VfAt" /etc/fstab

warningتحذير

لو أن هناك سطراً يحتوي # NON vfat goes here فإنه سيطبع لهذا نحن بحاجة لطرق بحث أقوى

ولكن ماذا لو كنت أريد أن أبحث ليس عن كلمة بل عن صيغة معينة أكثر تحديدا مثلا يبدأ بحرف وينتهي برقم أو أي شيء أكثر عمومية لهذا كان هناك ما يسمى بالتعابير العادية Regular Expression (إختصارا RE) الذي يمكنك من هكذا أشياء في ال RE هناك رموز لها معنى خاص هي . * ^ $ [ ] \ وتسمى POSIX Standard RE's وباقي الرموز تمثل نفسها بالنسبة للمعنى الخاص للأولى فهذا الجدول يوضحه

. أي شيء من خانة واحدة أو لا شيء .mتقبل am و pm و m
* تحديد أن ما قبلها يتكرر صفر أو أكثر مرة .*أي شيء من أي عدد من الخانات
^ بداية السطر ^aliواضحة سطر يبدأ ب ali
$ نهاية السطر ^$سطر يبدأ لينتهي يعني فارغ
[ ] أي من الأشياء التي بداخلها [a-zA-Z]أي حرف انجليزي
[^something] أي شيء ليس من الأشياء التي بداخلها [^0-9]ليس رقم
\ أي شيء الشيء نفسه 1\*1 تعنى 1*1 وليس 1 مكرر

إذا كنت تريد أن تستخدم شيئا بمعناه الحرفي وليس بمعناه الذي في الجدول تضع قبله \ . الكثير من البرامج تستخدم التاعبير العادية (القياسية والإضافية) مثل grep و awk و perl وغيرها ، وهناك امتداد إضافي لهذه التعابير القياسية Extended RE يضيف للرموز ذات المعاني الخاصة المجموعة التالية ? + { } ( ) | وللتوافقية مع المجموعة السابقة (حيث تمثل هذه الرموز نفسها) فإن هذه الرموز تمثل نفسها إلا إذا سبقنها ب \ فإنها تمثل المعنى الخاص.

tipتلميح

هناك برنامج يشذ عن هذه القاعدة وهو mcedit التابع لحزمة mc حيث تمرر الرموز الخاصة جميعها القياسية والممتدة دون \ لتمثل المعنى الخاص و بعلامة \ لتمثل نفسها.

البرامج في الغالب مهيئة للتعامل بالمجموعة الممتدة أيضاً ولكن برنامج grep لا يفعّلها إلا إذا استعملنا الخيار -e أو بتفيذه باسم egrep . المعنى الخاص لهذه التعابير الإضافية هو كما في الجدول

? تحديد تكرار ما قبله بمرة واحدة على الأكثر (مرة أو غير موجود) e\?xtraتطابق extra أو xtra
+ تحديد تكرار ما قبله لمرة واحدة على الأقل lo\+kتطابق lok أو look أو loook ...
{n} تحدد أن ما قبله مكرر n مرة بالضبط [a-ce-f]\{6\}6 حروف انجليزية ليس منها d
{n,m} ما قبله مكرر من n إلى m مرة [a-wy-z]\{3,6\}ما بين 3 إلى 6 حروف ليس بينها x
{n,} ما قبله مكرر على الأقل n مرة f\{5,\}5 حروف f أو أكثر
< > أن يكون ما بينهما كلمة مفصولاً وليس جزء من غيرها(أمين و تأمين) مثلا \<[a-zA-Z]*\> كلمة انجليزية
() معاملة ما بداخلها على أنه تعبير واحد. \(foo\)* foo مكررة وليس fo ثم o مكررة
| التعبير السابق لها أو اللاحق بها. [0-9A-Za-z]*.(com)|(net)|(org)ينتهي ب com أو net أو org
1 2 .. 9 ناتج مطابقة الأقواس ذات الرقم \([a-z]\+\)-\1مقطع مكرر يفصل بينه - مثل foo-foo
انظر هذا المثال egrep 'a{3}' ستبحث عن "a{3}" في المقابل egrep 'a\{3\}' تبحث عن a مكررة ثلاث مرات. وقد تم إضافة صنوف التعابير العادية (أي POSIX RE classes) وصيغتها [[:ClassName:]] حيث ClassName تعني واحدة من التالية
	alpha	[A-Za-z]
	upper	[A-Z]
	lower	[a-z]
	digit	[0-9]
	alnum	[A-Za-z0-9]
	space	any whitespace (space ,tab ,new-line)
مثلا cat text.txt | grep ^[[:alpha:]]*$ تعني سطر به أحرف انجليزية متتابعة فقط (سطر به كلمة واحدة فقط)

يمكنك أن تستعمل grep لتعمل تصاريف اللغة اللغة الإنجليزية مثلاً إذا كت تريد كل الكلمات التي تنتهي ب tion أو tial اكتب grep -ie 'tial$' /usr/dict/words /usr/share/dict/words | less

tipتلميح

يمكنك تجربة فهمك للموضوع بكتابة echo "SOMETHING" | egrep 'PAT' فإذا ظهر النص فهذا يعني أنه طابق التعبير وإذا لم يظهر فهو لم يطابق.

tipتلميح

يمكنك البحث عن ملف يحتوي تعبيراً معيناً بين عدة ملفات باستعمال الخيار -l في grep الذي يجعل grep يطبع اسم الملف الذي وجد سطراً يطابق التعبير المطلوب فيه.

ستعرف فائدة هذه الأشياء عند تطبيقها لنأخذ مثلا الأداة cut تستخدم لاختيار حقل من بين عدة حقول يفصل بينها علامة معينة(مسافة بشكل تلقائي) فتقول له اعتبر العلامة الفاصلة هي مثلا | والآن اكتب لي الحقل الثالث هكذا وصيغته cut -d Delimiter -f FieldNo[,FieldNo]...[FieldNo-FieldNo] حيث Delimiter هي الفاصل مثلا '|' و ما بعد f يمكن أن يكون 2-5 أو 1,6 لنفترض أن لديك ملف يحتوي معلومات عن المستخدمين /etc/passwd تبدأ باسمه ثم رقم مجموعته ثم معرفه ثم ... الخ يفصل بينها : اكتب الأمر لمعرفة معرف المستخدم ali علما انه في الخانة الثالثة

# لنلقي نظرة على الملف
bash# cat /etc/passwd
 ...
 ali:1000:100::/home/ali:/bin/bash 
 ahmad:1000:101::/home/ahmad:/bin/bash 
 ...
bash# cat /etc/passwd | grep ^ali | cut -d ':' -f 3
tipتمرين

اكتب الأمر الذي يكتب الجهاز(الأجهزة) المثل لمحرك الأقراص المدمجة (على فرض أن المعلومات في fstab غير صحيحة قديمة ربما) يمكنك استعمال dmesg

هناك أداة أقوى اسمها awk فهي لا تستخدم فاصل واحد بل whitespace (مسافة أو tab أو سطر فارغ أو تكرار ومزج بينها) وهو لغة متكاملة لمعالجة النصوص ما يهمنا هنا هو بعض هذه المزايا فقط وهي awk '{print $FieldNo [$FieldNo]...}' مثلا awk '{print $1}' تطبع الحقل الأول. اذا رغبت في تغيير الرموز الفاصلة عدل قيمة المتغير $IFS لا تنسى اعادته إلى ما كان عليه لأن هناك برامج أخرى تقرأ هذا المتغير

وهناك الأداة القيمة sed أي Stream Text Editor وهي محرر نصوص غير تفاعلي يأخذ مدى ثم يطبق شيئا عليه مثلا السطر كذا وكذا أو السطر الذي يحتوي كلمة على صيغة كذا

pprint يطبع ما يطابق
dيحدف ما يطابق
s/PAT1/PAT2 substitute يضع PAT2 مكان PAT1 لمرة واحدة
s/PAT1/PAT2/g substitute يضع PAT2 مكان PAT1 على كل المدى
y/PAT1/PAT2 يضع كل حرف موجود في PAT1 ما يقابله من PAT2 الأول بالأول والثاني بالثاني وهكذا (لذا يجب أن يكونا من نفس الحجم)

حيث كل النصوص هي Regular Expresions اذا لم تحدد مدى سوف يعمل على كل النص ويكون تحديد المدى بذكر رقم السطر(الأسطر قبل الأمر) أو بوضع صيغة RE للبحث عنها يفصل بينها / مثلا cat file | sed -e '/^Ali/s/ahmad/Ahmad/g' تعني في كل سطر يبدأ ب Ali بدل ahmad ب Ahmad وقم بالعملية أكثر من مرة واحدة ومثلا cat file | sed -e '/^$/d' تحذف الأسطر الخالية

يمكن التحويل من نظام ترميز إلى آخر بواسطة iconv وذلك ببساطة iconv -f FROMCODE -t TOCODE INPUT > OUTPUT مثلاً

bash$ iconv -f WINDOWS-1256 -t UTF-8 arabic.html > arabic-u.html

4.2.6 متفرقات

يمكنك أن تعرض التقويم/الرزنامة للشهر الحالي بأمر cal وهناك خيارات لعرض رزنامة السنة كاملة أو شهر محدد. لتعرف اليوم اكتب date سيعرض التاريخ والوقت لتغيّر طريقة عرضه استعمل + ثم التنسيق الذي تريد أن يعرضه به مثلاً date '+%Y-%m-%d' أو مع الوقت date '+%Y-%m-%d %I:%M:%S%p' انظر التاريخ والوقت في فصل مكتبة سي أو كتيب date. يمكن أن تعرف الوقت قبل كذا ساعة أو بعد كذا يوم (يمكنه التعامل مع حالات مثل إذا كنت في أول يوم من شهر كانون ثاني وعدت يوم للوراء) مثلاً لعرض لتاريخ قبل يومين date '+%Y-%m-%d' -d '-2 days' أو بعد يومين date '+%Y-%m-%d' -d '+2 days'. يمكن لهذا الأمر أن يغيّر الوقت والتاريخ بالخيار s كما في المثال
date -s '2004-07-11 20:45:00' و
date -s '2004-07-11 08:45:00pm' '+%Y-%m-%d %I:%M:%S%P'

باستعمال uptime أو cat /proc/uptime فإنها تعرض رقمين بالثواني (وأجزاء من مئة من الثانية) الأول هو الوقت منذ إقلاع لينكس أما الرقم الثاني فهو الزمن الذي أمضاه لينكس لا يفعل شيئاً idle كلما كبر الرقم الثاني هذا يعني أن أداء البرامج عالية ولا تتطلب الكثير من العمل وناتج طرح الرقمين هو الوقت الذي كان فيه النظام مشغولاً بعمل ما. في جهاز بدون إكس يكون ءلرقمان قريبان لدرجة لا تصدق. عند تنفيذ top أو في المؤشرات على معدل العمل loadavg مثل تلك في icewm أو مخرجات cat /proc/loadavg نجد ما يشبه 0.20 0.18 0.12 1/80 1120 تجد ثلاث نسب مئوية تشيد لنسبة إجهاد النظام (كلما زاد كان النظام يعمل ومشغول) النسب الثلاث هي لآخر دقيقة وآخر 5 دقاق وآخر 10 دقائق. أما نسبة الرقمين فهي عدد العمليات التي هي في حالة عمل (وليست نائمة بانتظار مدخلات) إلى العدد الكلي للعميات أما الرقم الأخير فهو PID لآخر عملية

لإرسال رسالة نصية لتظهر في سطر أوامر كل الطرفيات المرتبطة بالجهاز (الطرفيات الإفتراضية VT و الطرفيات التسلسلية) كما يحدث عندما تكتب الأمر halt أو في حال الفشل الكهربائي من UPS ستحصل على رسالة Message to all users: the system is going down يكون ذلك بالأداة wall ثم اكتب الرسلة ثم CTRL+D ولإرسالها لمستخدم واحد بعينه استعمال write وإذا كنت تشعر بالإنزعاج منها يمكنك وقف استقبال هذه الرسائل بأمك mesg أي mesg n أو للسماح باستقبالها مرة أخرى mesg y. وهذه الرسائل ليست بريد فهي لا تخزن بل تعرض بمجرد وصولها. أما للإتصال الفعلي قد تحب أن تستعمل talk أو البريد الإلكتروني العادي.


<< السابق كتاب لينكس الشامل التالي >>