4.2 عودة إلى سطر الأوامر | كتاب لينكس الشامل | >> |
تحدثنا عن فتح دليل باستخدام 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
تذكر . تعني الدليل الحالي و .. الدليل الأب و - الدليل السابق ~ الدليل البيت
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
وضعك لمسافة خطأ وأنت جذر قد يؤدي لنتيجة كارثية انظر هذا المثال
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
bash# export PRUNEPATHES="/mnt /tmp /proc $PRUNEPATHES" bash# updatedb
أما عمليات البحث عن ملفات المباشرة من القرص(دون استخدام جداول) تتم باستعمال
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
وهناك اذونات أخرى نشرحها لاحقاً
تحدثنا في درس العتاد عن
أمر 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 يقوم ببعض المزاح والنكت
أكثر طرق الضغط شيوعاً هي gzip لأنها طريقة سريعة وفعالة التي تضغط ملف واحد وتضيف له الاحقة .gz (الملف الأصلي سيختفي ويظهر الملف المضغوط) وتفك ضغط الملف عن طريق الخيار d أي decompress أو الأمر gunzip وعن الضغط يمكنك تمرير رقم يمثل مقدار الضغط من 1-9 حيث 9 أكبر ضغط وأبطئ سرعة. وهناك برنامج bzip2 وهي طريقة حديثة وتضغط بشكل أكبر وأقل سرعة وتأخذ خيارات مشابهة لسابقه. ويمكنهما أن يضغطا الدخل الإفتراضي أو يرسلا ناتج الفك إلى جهاز الإخراج الأفتراضي.
تعطي طريقة الأرشفة ثم الضغط(الضغط العام) فاعلية أكبر من مثيلاتها أي الضغط ثم الأرشفة(المستخدمة في 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
ملاحذة ال * (وأيضا ؟) لا تشمل الملفات المخفية التي تبدأ بنقطة "."
وهذا جيد لتجاهل الملفات المؤقتة (أو النسخ الإحتياطية) وملفات الإعدادات
والملفات التي ينشرها مدير الملفات ،
اذا كنت تريد اضافة الملفات المخفية اكتب المجلد
فيأخذ كل شيء بداخله يعني اكتب
عند عمل أرشيف من مجلد بأمر
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 التي تستطيع تعرف إضافة سطر واحد في بداية الملف (الأدوات الأخرى ستظن أن كل الأسطر بعده مختلفة).
كل برنامج تنفذه يسمى عملية 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$
CTRL+Z
يتم تعليق عملية النسخ وستحصل على
[2] 175 stoped cp bash$
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
fuser -km /mnt/floppy
ستحصل على نصيحة
بأن كل ما بقي عليك هو عملية umount.
تستطيع هذه الأداة العمل على الشبكات وعرض ما يتصل بقنواة socket معينة
مثلاً أن تعرض من يتصل على عنوان أو منفذ معين
انظر فصل 5.2 العمل في الشبكات.
كما لاحظنا يمكنك تحرير ملف دون الإستعانة بمحرر نصوص باستعمال 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
وبكلمات أخرى تخبرك عن أقسام ويندوز.
يمكن جعل grep غير حساس لحالة الحروف (إن كبيرة أو صغيرة) باستعمال الخيار -i
مثلاً grep -i "VfAt" /etc/fstab
لو أن هناك سطراً يحتوي # 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 يضيف للرموز ذات المعاني الخاصة
المجموعة التالية ? + { } ( ) |
وللتوافقية مع المجموعة السابقة (حيث تمثل هذه الرموز نفسها) فإن
هذه الرموز تمثل نفسها إلا إذا سبقنها ب \ فإنها تمثل المعنى الخاص.
هناك برنامج يشذ عن هذه القاعدة وهو mcedit التابع لحزمة mc حيث تمرر الرموز الخاصة جميعها القياسية والممتدة دون \ لتمثل المعنى الخاص و بعلامة \ لتمثل نفسها.
-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
يمكنك تجربة فهمك للموضوع بكتابة
echo "SOMETHING" | egrep 'PAT'
فإذا ظهر النص فهذا يعني أنه طابق التعبير
وإذا لم يظهر فهو لم يطابق.
يمكنك البحث عن ملف يحتوي تعبيراً معيناً بين عدة ملفات
باستعمال الخيار -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
اكتب الأمر الذي يكتب الجهاز(الأجهزة) المثل لمحرك الأقراص المدمجة
(على فرض أن المعلومات في fstab غير صحيحة قديمة ربما)
يمكنك استعمال
dmesg
هناك أداة أقوى اسمها awk
فهي لا تستخدم فاصل واحد بل whitespace (مسافة أو tab أو سطر فارغ أو تكرار ومزج بينها)
وهو لغة متكاملة لمعالجة النصوص
ما يهمنا هنا هو بعض هذه المزايا فقط وهي
awk '{print $FieldNo [$FieldNo]...}'
مثلا
awk '{print $1}'
تطبع الحقل الأول.
اذا رغبت في تغيير الرموز الفاصلة
عدل قيمة المتغير
$IFS
لا تنسى اعادته إلى ما كان عليه
لأن هناك برامج أخرى تقرأ هذا المتغير
وهناك الأداة القيمة sed أي Stream Text Editor وهي محرر نصوص غير تفاعلي يأخذ مدى ثم يطبق شيئا عليه مثلا السطر كذا وكذا أو السطر الذي يحتوي كلمة على صيغة كذا
p | print يطبع ما يطابق |
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
يمكنك أن تعرض التقويم/الرزنامة للشهر الحالي بأمر 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 أو البريد الإلكتروني العادي.
<< السابق | كتاب لينكس الشامل | التالي >> |