3.2 سطر الأوامر ليس مخيفاً!!
اقتباسات هذا الفصل:
- "الأمر (اسم): عبارة يقدمها الإنسان ويقبلها الحاسوب
بطريقة تجعل الإنسان يشعر بأنه هو الذي يتحكم."
-- برنامج 'fortune-mod'
- "حسناً، فإن يونكس بديهي، لأن كل ما عليك هو تعلم 5000 أمر
وكل شيء آخر يتبع من ذلك!"
-- شخص يسخر من الأوامر على 'comp.os.linux.misc'.
محتويات هذا الفصل:
3.2.1 مقدمة لسطر الأوامر
يعتبر سطر الأوامر في لينكس من أهم مميزاته
لأنه يسمح لك بتنفيذ أشياء معقدة بطرق بسيطة جدا
لذا من الطبيعي أن تجد نافذة سطر الأوامر دائمة مفتوحة
عند مستخدمي لينكس ،
فعلى الرغم من كون سطر الأوامر لغة برمجة تفسيرية
إلا نه يمكن لغير الخبراء والمبرمجين استعماله
بدون أي صعوبة
ومن باب الحرية -وهو شعار FSF-
فإنك تستطيع استخدام أي برنامج ليكون مفسراً لأوامرك يسمى غلاف shell
حاليا الأكثر شهرة هو bash
ولكن يستطيع كل مستخدم تغييره واستخدام آخر مثل ksh أو csh أو tcsh ...
تلميح
BASH أي Bourne Again SHell
وقد سمي كذلك لأن بيرني عمل برنامج سماه على اسمه غلاف بيرني (اسم الملف sh)
ولكن بعد مدة ظهرت برامج أقوى منه مثل korn shell (اسمه ksh) و csh و tcsh
فانقرض هذا البرنامج حتى جاء أحد عشاقه فطوّره وأضاف عليه الميّزيات
المنافسة وغيرها وسماه غلاف بيرني مرة أخرى!! إنه الآن جزء من مشروع غنو
يعكس فلسفة غنو في أن لغات البرمجة النصية
scripting languages يجب أن تكون لغات برمجة حقيقية صممت
لكتابة برامج جوهرية والقيام عليها.
ويجب أن لا يختلط الموضع عليك بين الغلاف والطرفية terminal
فهي البرنامج الذي يشغل البرنامج الغلاف في البيئة الرسومية(أو غير الرسومية)
وأنت عندما تريد تشغيل سطر الأوامر في البيئة الرسومية تقوم بتشغيل الطرفية/التيرمينال
(كما هي العادة لا يوجد تيرمينال واحدة بل تختار ما يناسبك)
وتختلف هذه فيما بينها بمقدار الجمال ودعم اللغات ودعم الجر والاسقاط
مثلا
- xterm - الأبشع على الإطلاق وتغيير الخط أو الخلفية ضرب من الجنون
- rxvt - أقل بشاعة من سابقه، ملونة وتستهلك ذاكرة أقل
(اشتق منها 'krxvt' و 'crxvt' لدعم الصينية واليابانية)
- aterm - جميلة ويمكن أن تكون الخلفية شبه شفافة
ترجع في أصلها إلى مدير نوافذ Afterstep.
- eterm - واحدة أخرى تتناسب مع مدير نوافذ Enlightenment.
- wterm - واحدة أخرى تتناسب مع مدير نوافذ Window Maker.
- mlterm - متعددة اللغات وبها دعم رائع للغة العربية.
- konsole - من أجمل ما يكون وهو تابع لمجموعة kde ويمكن أن تكون الخلفية شفافة.
- gnome-terminal - من أجمل ما يكون وهو تابع لمجموعة غنوم ويمكن أن تكون الخلفية شفافة.
وتكون أيقونتهم على شكل شاشة سوداء
أو صدفة (معنى آخر ل shell ). ربما تجد الطرفية التي اختارتها التوزيعة في
القائمة الرئيسية ثم أدوات النظام System tools ثم الطرفية terminal.
وهناك أيضا الشاشة النصية غير الرسومية ال console
ويمكن الذهاب إليها بالتغيير إلى طرفية إفتراضية VT غير رسومية
(معظم التوزيعات تشغل سبع طرفيات افتراضية تعمل كل منها وكأنها جهاز منفصل
وتخصص الأخيرة لتكون رسومية أي سيكون لديك سبعة أجهزة في جهاز)
اضغط CTRL+ALT+Fn (حيث Fn هي F1 F2 ...) للتحول إلى الطرفية الوهمية
النونية(الأولى أو الثانية...الخ ) إن الأمر أسهل مما يبدوا،
اضغط CTRL+ALT+F1 ستتحول إلى شاشة نصية تطلب
منك ادخال اسم مستخدم كلمة سر ثم تعطيك سطر أوامر
تستطيع تشغيل أي شيء
اضغط CTRL+ALT+F2 ستتحول إلى شاشة نصية أخرى
وهكذا حتى السابعة التي هي الشاشة الرسومية
وتعمل كلها معا
ملاحظة: يمكنك التغيير من عددها أو ترتيبها
تزيد منها إذا كنت مبذرا أو لديك جهاز سريع
أو تقللها للتقليل من إرهاق الجهاز
عند تشغل سطر الأوامر بأي طريقة منها يظهر
[folder@host]$
للمستخدم العادي او [folder@host]# للمستخدم الجذر
والحكمة من ذلك هو تحذيرك لأن خطأ إملائي بسيطة وأنت جذر
قد يخرب النظام بينما للمستخدم العادي يقول له "لا يحق لك تدمير النظام" وحتى هذه
يمكن تغييرها.
ابدأ بكتابة الأمر (انتبه الأحرف الكبيرةA تختلف عن الصغيرة a )وعندما تنسى كيف يكتب اكتب جزءاً منه ثم اضغط TAB
ولكي تعرف كل البدائل اضغط TAB مرتين
وعندما تنتهي اضغط إدخال [ENTER]
مثلا بدلا من كتابة
cd /home/ali/
يكفي أن تكتب
cd /h [TAB]a[TAB]
وإذا كان هناك ali و ahmad
cd /h [TAB]a[TAB][TAB]
سيظهر
ali ahmad
اضغط l[TAB] ليصبح لديه al[TAB] ونكون انتهينا
وتفيد هذه الميزة أيضا عندما يكون هناك أسماء طويلة مثلا لتشغيل
لعبة rocksndiamonds يكفي أن تطبع بعض الحروف ثم [TAB] ،
ويمكنك استخدام سهم لأعلى ولأسفل للحصول على الأوامر التي
طبعتها من قبل (وتظل محفوظة حتى عند إعادة تشغيل الجهاز) ولأسباب
أمنية كل مستخدم يحصل على الأوامر التي طبعها هو وليس غيره ،
استخدم الأسهم الجانبية للتحرك لليمين واليسار أيضا،
ويمكن أن تجعله يدقق أخطائك الإملائية تلقائيا !!
3.2.2 لنبدأ بطباعة الأوامر
هذا جدول يبين الأوامر الأساسية ،
ما هو داخل أقواس مربعة [ ] يمكنك عدم كتابته ،
و ... تعني التكرار ، | تعني اكتب هذا أو هذا
وحتى لا تخلط بين ما هو الشيء الحرفي وما هو الذي تعوّض مكانه معناه
وضعنا هذه الأخيرة بخط مائل، الأمر ليس معقدا كما يبدو، مر على الجدول بسرعة
واستعمله كمرجع سريع مؤقت، وأنت ترى الأمثلة التي تليه وتطبقها عملياً
| cd [DIR]
|
للدخول إلى مجلد(دليل) DIR
وإذا كتبت cd لوحدها سوف تذهب إلى الدليل البيت
وللعودة إلى الدليل الذي كنت فيه
اولا cd -
وللذهاب للدليل الأب للدليل الذي أنت فيه
cd ..
وللذهب إلى الدليل الأصل/الجذر الذي تتفرع منه الأدلة الأخرى
cd /
|
| pwd |
عرض المسار إلى الدليل الحالي
|
| ls [-lhFa] [PATTERN]
|
عرض الملفات التي تتفق مع PATTERN
، استخدم l للعرض المفصل و h لإظهار الحجم بطريقة مفهومة أكثر
و F لوضع علامة تبين نوع الملف بعد اسمه
و a لعرض جميع الملفات حتى التي تبدأ بنقطة
وهناك الكثير
|
| clear |
مسح الشاشة
|
echo ["STRING"]
printf "STRING1" ["STRING2"]...
|
الأولى تطبع النص إلى جهاز الإخراج القياسي ، الثانية بطريقة لغة السي
|
| help [BUILTINCOMMMAND]
|
عرض مساعدة عن أمر من الأوامر المبنية داخل BASH.
|
whatis [NAME]
man [NAME]
info [NAME]
|
عرض مساعدة عن الأمر أو الملف الفلاني
مثلا man ls أو info grub (للخروج من البرنامج اضغط q)
أو whatis gedit الذي يعرض معلومات من سطر واحد
يتم توليدها بواسطة mkwhatis.
|
| apropos [NAME]
|
البحث في قاعدة بيانات whatis عن نص مثلاً 'apropos keyboard leds'
(قد يكون عليك تشغيل mkwhatis إن لم تكن موجودة).
|
less [FILE]
more [FILE]
|
عرض ملف على الشاشة
استخدم الأسهم و PageUP PageDown للحركة
(للخروج من البرنامج اضغط q)
|
| cat [FILE]...
|
عرض ملف (ومجموعة ملفات) على الشاشة
بطريقة غير تفاعلية
(الوصف الحقيقي للأمر هو أنه يجمع هذه الملفات ثم يرسلها
إلى جهاز الإخراج القياسي
)
|
| dd [if=FILE1] [of=FILE2] [bs=N] [count=M]
|
إرسال M وحدة كل منها بحجم N بايت (يمكنك أن تضع k و M للكيلو والميغا) الأول
من الملف الأول (تعني if - input file) إلى الثاني (نعم output file)
إذا لم تحدد إي من الملفين فإنه الدخل/الخرج القياسي.
تستخدم غالباً مع ملفات الأجهزة.
|
cp [-aRvi] SOURCE... DEST
mv [-aRvi] SOURCE... DEST
rm [-Rv] FILES
|
نسخ ، نقل(نسخ وحذف الأصل أو تغيير الاسم) وحذف على الترتيب.
من المصدر(المصادر) إلى الهدف والخيارات هي :
i السؤال "هل أنت متأكد؟" قبل الحذف
v اكتب ماذا تفعل خطوة خطوة
a الحفاظ على نوع الملف
R نقل الأدلة الفرعية
|
mkdir DIR...
rmdir DIR...
|
عمل دليل جديد ، وحذف دليل فارغ على الترتيب.
|
ln [-sf] FILE_OR_DIR LINK
sln FILE_OR_DIR LINK
|
عمل رابط/وصلة تشير إلى الملف الأول
وتتصرف مثلها تماماً ( أن يكون لديك نسختين من نفس الملف
في أماكن مختلفة إن شئت
دون أن تأخذ حيزاً على القرص) ، الخيارات :
s أن يكون الرابط soft أي يظهر عند عمل ls -l
f اجبار احلال الرابط الجديد مكان القديم. البرنامج الثاني static يعمل حتى لو كانت وصلات المكتبات
غير صحيحة.
|
| su [USER]
|
التحول إلى مستخدم آخر إذا لم يذكر من هو يعتبر الجذر
(طبعا بعد أن يقدم كلمة السر له)
|
| whoami
|
تخبرك من أنت !! أي المستخدم الذي تمثله الآن
|
| file [PATTERN]
|
عرض الملفات وما هو نوعها بطريقة مفهومة (اعتمادا على تركيبها ليس الإمتداد) مثلا
يقول لك أن هذه English text file وذلك ASCII C text file وذلك
MPEG video file ...
|
df [-hbkmg] [PARTITION | DIR]
du [-hbkmg] [FILE_OR_DIR]
|
عرض المساحة المتبقية،والمساحة التي يشغلها دليل معين
b بالبايت ، k بالكيلوبايت ،
m بالميغا ، g بالغيغا ،
h بطريقة مفهومة
|
| free
|
عرض المساحة المتبقية من الذاكرة والذاكرة الإفتراضية
|
| COMMAND1 ; COMMAND2 [ ; COMMAND3]...
|
تنفيذ الأمر الأول ثم نفذ الثاني وهكذا
|
| COMMAND1 && COMMAND2 [ && COMMAND3]...
|
تنفيذ الأمر الأول فإذا نجح نفذ الثاني وهكذا
|
| COMMAND1 || COMMAND2 [ || COMMAND3]...
|
تنفيذ الأمر الأول فإذا لم ينجح نفذ الثاني وهكذا
|
| COMMAND1 &
|
نفذ الأمر في الخلفية (لا ينتظر حتى ينتهي ويمكنك من تشغيل أوامر أخرى )
|
| COMMAND1 | COMMAND2
|
تمرير مخرجات البرنامج الأول إلى الثاني ، تسمى هذه التقنية
بالأنبوب (pipe)
|
| `COMMAND`
|
ناتج(مخرجات) تنفيذ هذه البرنامج
ملاحظة ` تحصل ليها من المفتاح قرب الواحد الذي يحمل حرف الذال
والعلامة ~
وهي ليست علامة اقتباس مفردة " بدون shift
|
| $VARIABLE
|
قيمة المتغير ويسمى هذا تعويض
|
| VARIABLE=VALUE
|
وضع المتغير على القيمة (لا يوجد مسافة)
|
| set
|
عرض كل متغيّرات البيئة وقيمها.
|
| COMMAND [ < FILE1 ] [ > FILE2 ]
|
استخدام الملف الأول كجهاز ادخال قياسي والملف الثاني
كجهاز إخراج القياسي
|
| COMMAND [ < FILE1 ] [ << "STRING" ]
|
استخدام الملف الأول كجهاز ادخال القياسي من أوله وحتى الحصول على النص
"STRING"
|
| COMMAND [ >> FILE ]
|
إضافة مخراجات الأمر إلى نهاية الملف
|
| COMMAND [ 1> FILE1 ] [ 2> FILE2 ]
|
ارسال المخرجات إلى الملف الأول وإرسال رسائل الخطأ إلى الملف الثاني
|
ولتسهل عليك حفظ الأوامر اعرف أصل أسماءها
cd (Change Dir ) , pwd (resent working dir),ls(list) , man (manual page) ,
cp (copy) , mv (move) , rm (remove) ,
mkdir (Make Dir ) , rmdir (Remove Dir ) , ln (link)
du (disk usage) , df (disk free) , su (super user)
وأيضا الخيارات
a (all ) , f (force) , R (recursive) , h (human readable)
v (verbos :give info while working)
القليل من الأوامر مثل 'pwd' و 'clear' تعمل فقط
بكتابة اسمها ثم الضغط على مفتاح الادخال ENTER، في حين أن أغلب الأوامر تتقبل
معلومات أو خيارات من المستخدم تتحكم في سلوكها هذا
يسمى تمرير المعاملات (أي arguments أو parameters)
تكتب بعد الأمر يفصلها فراغات whitespaces وذلك قبل ضغط مفتاح الادخال ENTER.
تلميح
تكون خيارات معظم الأدوات على شكل -- ثم الخيار مثلا
--force --verbos
وللإختصار نضع - واحدة ثم الخيار المختصر
-f -v
ويجوز أيضا كتابة
-fv بدون مسافة بينهما ، أي أن
[-abcdef] تعني -a -b -c -d -e -f.
وهكذا.
كما في الجدول يمكنك طلب مساعدة عن برنامج معين مثلا bc بكتابة
man bc التي تعرض كتيب الاستخدام أو بكتابة
info bc
التي تعرض صفحة المعلومات
الفرق بين كتيب الإستعمال man و صفحة المعلومات info
أن الأولى أقل تفصيلاً واختصاراً وأكثر استعمالاً إلا أن
الثانية مفصلة أكثر ومتشعبة أكثر (تحرك بالأسهم ثم اضغط إدخال ENTER
على موضوع معين لعرضه للتالي n وللسابق p ولدرجة أعلى u)
للخروج من البرنامجان استخدم q وللبحث / أو ؟.
توفر كتيبات man معلومات عن المواضيع التالية(بالترتيب)
- 1 الأوامر user commands
- 2 وظائف نواة لينكس System Calls
- 3 وظائف المكتبات المختلفة مثل مكتبة سي Subroutines
- 4 الأجهزة الموجودة في مجلد /dev أي devices
- 5 هيئة الملفات والبروتوكولات، مثل صيغة /etc/lilo.conf.
- 6 الألعاب Games
- 7 منوعات Miscellenous واصطلاحات أو أعراف Conventions
ومعايير واختصارات macro packages مثل جدول آسكي.
- 8 أدوات النظام فقط للجذر System Administation
- 9 نواة لينكس kernel
- n وثيقة جديدة غير مصنفة New Document
- l للاستخدام المحلي على جهازك فقط local
وقد يحصل أن يوجد أكثر من كتيب بنفس الاسم مثلا printf هي أمر ووظيفة من مكتبة سي
إذا كتبت man printf سيعرض لك الأمر وليس وظيفة سي
لأنها أولاً في القائمة إذا أردت أن تحدد له أيها يعرض اذكر الرقم مثلاً
man 3 printf
تظهر مساعدة عن وظيفة printf من مكتبة سي
هناك برنامج xman الرسومي الذي يعرض قائمة (بشعة) لتختار منها
الكتيب الذي تريد عرضه ويمكنك النقر على البيت home ثم كتابة
man:printf
في العنوان سيعرضها عليك بشكل مرتب أو يمكنك استعمال مركز مساعدة kde
المسمى khelpcenter
(التي تشغلها من قائمة help في أي برنامج من عائلة kde أو من قائمة K الرئيسية )
ثم اختر من اللوح الجابي UNIX manual pages أي الكتيبات ثم اختر القسم مثلاً 5 الخاص بهيئة الملفات
ثم اختر lilo.conf.
|
|
أما بالنسبة لصفحات المعلومات فهي الأخرى يمكن فتحها بطريقة رسومية
جميلة من خلال مدير الملفات بالنقر على البيت home ثم كتابة info:xboard
حيث xboard هو الموضوع/البرنامج الذي تريد أن تقرأ عنه. كما ويمكنك
استعمال مركز المساعدة في kde بنفس الطريقة السابقة ولك بالنقر على
Browse info pages من اللوح الجانبي ثم المجال مثلاً games ثم اسم البرنامج/الموضوع
مثلاً xboard
|
|
هذه بعض الأمثلة
عندما تشاهد # في مجموعة من الأوامر فهي وما بعدها إلى نهاية السطر
لا تنفذ ، وللتمييز بينها وبين التي يكتبها الجهاز تلقائيا
قبل الأمر (المُحث) عندما تكون الجذر وضعنا ما تكتبه أنت بخط غامق وما
يظهر على الشاشة بخط عادي
bash$ cd ~
bash$ pwd
/home/ali
bash$ whoami
ali
bash$ echo "Hello World"
Hello World
bash$ echo "any thing after hash" # is a comment,it has no effect
any thing after hash
bash$ echo "Hello `whoami`" # note ` not '(single quote)
Hello ali
bash$ su
password:********
bash# whoami
root
bash# exit
bash$ whoami
ali
bash$ ls -F
Projects/ readme.txt backround.jpeg test.sh*
bash$ ls -l
total 4
drwxr-xr-x 2 ali users 4024 May 28 19:20 Projects
-rw-r--r-- 1 ali users 19106 May 28 19:20 readme.txt
-rw-r--r-- 1 ali users 1224 May 28 19:20 backgrond.jpeg
-rwxr-xr-x 1 ali users 1024 May 28 19:20 test.sh
bash$ echo "ali is the owner of the files
> and they belong to users group"
notice that ali is the owner of the files
and they belong to users group
bash$ gedit readme.txt # يجب أن تغلق المحرر لتعود لكتابة الأوامر
bash$ gedit readme.txt & # & تستطيع الكتابة دون إغلاقه بسبب
bash$ mcedit readme.txt # بدون & لأنه غير رسومي ، F10 للخروج
اكتب شيئا يملئ صفحتين في هذا الملف وخزن
bash$ less readme.txt # press q to quit, / to search
bash$ ls -l /usr/lib | less # list file in pager
bash$ man file # كما في less
bash$ file * # انظر النتيجة بنفسك
bash$ mc
عند كتابة ls -l
فإن القائمة تكون مفصلة وتحتوي أولا على خصائص الملف
مثلا d للدليل/المجلد directory و l للوصلة link و أما c فتعني أن الملف عبارة عن جهاز حرفي charecter device
أي ترسل له المعلومات حرفاً تلو الآخر مثل لوحة المفاتيح
أما b للإشارة إلى أن الملف جهاز
block device مثل الأقراص
بعد الحرف الأول تأتي الأذونات مثلا rwxr-xr-x
للمالك ثم للمجموعة ثم للآخرين قراءة و كتابة وتنفيذ على الترتيب
ثم رقم يكون واحد للملف العادي ويكون عدد الأدلة الفرعية
للمجلدات (دون الوصلات وتجمع له 2 وهما الدليلان ./ و ../)
ثم اسم المالك ثم المجموعة ثم الحجم ثم الوقت ثم اسم الملف
تلميح
إذا كانت مخرجات أمر أكثر من صفحة
يمكنك العودة إلى الصفحات التي فاتتك باستعمال
SHIFT+PGUP/SHIFT+PGDN
ويمكنك قص ونسخ الأوامر من الشاشة وذلك بتعليم (تحديد) النص
(بجر الفأرة من بداية الكلمة إلى نهايتها)
ثم النقر بالزر الأوسطر (الزرين معاً إذا لم يكن موجوداً)أو بالزر الأيمن في بعض البرامج
فينتقل النص إلى موقع المؤشر
لإيقاف عمل برنامج اضغط على CTRL+c (تكتب أحيانا Cc للإختصار)
لإيقاف الدخل اضغط على CTRL+d (وتعني نهاية الملف EOF)
وإذا كنت تتسائل لماذا لا يوجد خيار ل ls ليعرض صفحة صفحة
فذلك لأنك تستطيع استعمال SHIFT+PageUp / SHIFT+PageDown
للصعود لأعلى والنزول في أي وقت في أي برنامج
أو يمكنك ارسال مخرجات الأمر ls إلى less أو more باستخدام الأنبوب "|"
كما في المثال أعلاه.مستخدمي سطر الأوامر يحبون برنامج
mc (أي midnight commander) وهو شبيه ب nc (أي norton commander)
جربه وبرنامج mcedit جزء منه.
إذا أردت طباعة أمر وأردت أكثر من سطر
اكتب عندما تمل من السطر الحالي \
ثم اضغط ادخال تلاحظ أن لم ينفذ شيئا
اطبع بعض الأوامر ثم \ وادخال وهكذا إلى أخر سطر لا تضع فيه
\ عندها سينفذ الأوامر
bash$ echo "GNU/
> Linux"
GNU/
Linux
bash$ echo "GNU/\
> Linux"
GNU/Linux
bash$ ls /usr/bin/ \
> /usr/sbin/ \
> /usr/doc/ | \
> less
# نفس الأمر التالي
bash$ ls /usr/bin/ /usr/sbin/ /usr/doc/ | less
ادرس هذه الجلسة:
# لاحظ الخطأ الإملائي
[/@host]$ cd /hpme/ali # بدلا من cd /home/ali
cd: /hpme/ali not found
# تفعيل تصحيح الأخطاء الإملائية في أمر تغيير الدليل لجلسة واحدة
[/@host]$ shopt -s cdspell
[/@host]$ cd /hpme/ali # بدلا من cd /home/ali
/home/ali
[/home/ali@host]$ cd /user/ben
/usr/bin
[/usr/bin@host]$
هذا الأمر عليك طباعته كل مرة تريد تشغيل التدقيق الإملائي !!
كيف نجعل هذا الأمر ينفذ تلقائيا ؟ اعلم أنه يتم تنفيذ
/etc/profile أو ~/.bashrc
تلقائيا فإذا كنت تريد إضافته لكل المستخدمين فعليك بالملف /etc/profile
أما إذا كنت تريده لك وحدك فليك بالملف .bashrc
في بيتك (تذكر أن ~ تعني الدليل البيت وهو يختلف من مستخدم إلى آخر) هذه الطريقة
# تصحيح الأخطاء الإملائية في أمر تغيير الدليل
# تلقائيا ولك وحدك دون غيرك
[~/@host]$ echo "shopt -s cdspell" >> .bashrc
# تصحيح الأخطاء الإملائية في أمر تغيير الدليل
# تلقائياً ولكل المستخدمين
[~/@host]$ su root
password:******
[/home/ahmad@host]# echo "shopt -s cdspell" >> /etc/profile
[/home/ahmad@host]# exit
[~/@host]$
لاحظ بدلا من تشغيل محرر نصوص وانتظار تحميله ثم فتح أحد الملفين المذكورين
وإضافة السطر إلى آخره ثم تخزين الملف يااااه !! فقط كتبنا
echo ثم الأمر وهي تطبع الأمر إلى الخرج
ثم حولنا الخرج من الشاشة إلى نهاية الملف بإشارة الإتجاه المزدوجة >> فقط !!
(لاحظ لو وضعناها مفردة لمحيت محتويات الملف السابقة)
تلميح
اكتب الأمر اللازم لعمل ملف يحتوي على قائمة محتويات الدليل /usr/bin.
في المثال التالي نعمل ملف نصي جديد دون استعمال محرر نصوص:
[~/@host]$ cat > test2.txt << HANGA
Start Typing
You can have more that one line
To End the Typing, Type the Magic Word
HANGA
[~/@host]$ less test2.txt
# cat يرسل كل الملفات التي تعطيها إياه إن لم توجد يأخذ الدخل القياسي -لوحة المفاتيح
# وقد حددنا كلمة معينة لتكون إشارة إنهاء الإدخال وهي التي بعد <<
# وحددنا جهاز الإخراج ليكون الملف test2.txt
يتأثر سلوك بعض البرامج بواسطة متغيرات البيئة Environment variables،
تحدد قيمة متغير البيئة بواسطة '=' مثلاً
اكتب 'my_age=25' ثم اكتب 'echo $my_age'،
علامة الدولار '$' تطلب من BASH أن يعوض 'my_age' بقيمتها،
اكتب 'bash' لتشغيل عملية BASH جديدة وجرّب 'echo $my_age'
مرة أخرى ولاحظ أن القيمة لم تحفظ، نستخدم أمر 'export' المبني داخلياً
متبوعاً بالمتغير ليحافظ على قيمته في بنيات العمليات الجديدة newly created child
processes (جاء الاسم من تصدير قيمة المتغيّر)،
اكتب 'exit' و جرب 'export my_age=25'.
تستخدم متغيرات البيئة للعديد من الأغراض مثلاً
LANGUAGE تتحكم في اللغة المحلية للبرنامج.
يستخدم BASH العديد منها لتفصيل سلوكه حسب رغبتك،
مثلاً CDPATH يحتوي قائمة بالأدلة (تفصلها ":") التي يجرب داخلها
أوامر 'cd' الناقصة، جرب هذه الجلسة:
bash$ export CDPATH=.:/mnt:/usr/local:/usr/share/doc
bash$ cd win_c/temp
/mnt/win_c/temp
bash$ cd floppy
/mnt/floppy
bash$
الأوامر التي ننفذها يتم تشغيلها من أدلة مختلفة منها غالبا الدليل الحالي ،
وقد يكون برنامجان لهما نفس الاسم كيف تعرف أيها سينفذ؟
اكتب which COMMAND
سيكتب لك المسار للأمر
فإذا كنت تريد تنفيذ واحد من مسار آخر
اكتب المسار قبل الأمر، أما كيف تحدد الأدلة التي يبحث فيها عن برامج
فهو متغير البيئة PATH
# مسار البرنامج
[~/@host]$ which cat
/bin/cat
[~/@host]$ echo "$PATH"
/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:./
# لإضافة دليل إلى آخر (أقل أولوية) القائمة
[~/@host]$ PATH="$PATH:/MY_DIR"
[~/@host]$ echo "$PATH"
/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:./:/MY_DIR
# لإضافة دليل إلى أول (أعلى أولوية) القائمة
[~/@host]$ PATH="/MY_FOLDER:$PATH"
[~/@host]$ echo "$PATH"
/MY_FOLDER:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:./:/MY_DIR
# هذا التعديل مؤقت ويزول عند إعادة التشغيل
# لاحظ معظم التوزيعات تضع الدليل الحالي /. في آخر الألويات
###############
# يجوز وضع التعويض في أي مكان
[~/@host]$ echo $EDITOR
vim
[~/@host]$ $EDITOR
# تشغيل البرنامج المحدد بالمتغير
لاحظ عندما تحدثنا عن أمر ls وغيره فإننا قلنا أنه يأخذ نموذج PATTERN
وليس اسم ملف أو مجلد وهكذا معظم الأوامر الأخرى
(حتى لو لم نذكر ذلك لأن bash هو من يقوم بالتعويض)
القليل من الأوامر لا تتوقع ذلك (مثلاً 'mv *.jpg *.png' لا تعمل كما يتوقع مستخدمي دووس)،
هذا مفيد جداً حيث تمرر للبرنامج نموذجاً عاماً للملفات
بدلاً من ذكرها كلها حيث يقوم BASH بتعويض كل الملفات التي تطابق النموذج.
نمثل النموذج برموز خاصة تترجم بالمعاني المبينة في الجدول المرافق
وأي شيء آخر يترجم حرفيا تسمى هذه wildcards ("الجواكر" في لعبة الشدة):
| *
|
أي شيء من أي طول (بما في ذلك لا شيء)
| *term* | كل شيء فيه term
|
| ?
|
محرف (رمز) واحد
| S??autofs | يبدأ ب S ثم محرفان ثم autofs
|
| [SET]
|
أي محرف من عناصر المجموعة
| [a-zA-z][0-9] | حرف ثم رقم من منزلة واحدة
|
| [^SET]
|
أي محرف من خارج المجموعة
| [^0-9] | محرف غير رقمي
|
| {PAT1 [ ,PAT2]...}
|
النموذج الأول أو الثاني ...
| *.{jpeg,png} | أي شيء ينتهي ب . ثم jpeg أو png
|
رموز Wildcards (* و ?) لا تتابق مع النقطة البادئة للملفات المخفية،
قد يظن شخص أن الحل يشبه '.*' لتمثيل الملفات المخفية،
فيستعمل 'ls .* *' لعرض كل الملفات المخفية وغير المخفية،
ولكن انتبه هذا غير صحيح، جرب ذلك بنفسك (مررها
المخرجات إلى less عبر انبوب لتراها صفحة صفحة)،
ربما لاحظت أن الدليل الأب '..' كان مشمولاً! هذا خطير جداً
تخيل محاولة ازالة المفات المخفية من الدليل البيت للمستخدم الجذر
'/root' بالأمر 'rm -r /root/.*'،
لأنه يزيل كل الملفات في النظام! الطريقة الصحيحة للتعبير
عن الملفات المخفية هي '.[^.]*' أي نقطة ثم محرف غير النقطة
ثم أي شيء.
أصبح الآن هناك رموز لها معنى غير ما هي عليه
مثلا ؟ ليست علامة سؤال وإنما تمثل أي حرف
وأيضا $VAR تعني قيمة المتغير VAR
فإذا أردنا المعنى الحرفي لشيء وليس المعنى المجازي
مثلا فتح ملف باسم
Why?
ونقصد هنا بعلامة السؤال علامة السؤال
وليس أي حرف
إذاً كيف نخبره بذلك
يتم ذلك بطريقة تسمى escape وذلك بإضافة \ قبل الرمز الذي تريد
مثلا
Why\?
ستعني الملف الذي نريد
مثلا إذا كنت تريد الذهاب إلى مجلد
Mohammad Ali
فإن كتابة
cd Mohammad Ali
لن تنجح لأن cd لا تأخذ سوى معامل واحد
والمسافة بين محمد ولي ستعتبر فاصل بين المعاملات
لذا فالصواب أن تقول
cd Mohammad\ Ali
هنا المسافة ستعني مسافة
وهناك طريقة أخرى وهي استعمال علامة التنصيص (الإقتباس) وهي
نوعان الأول هو التنصيص القوي (علامة تنصيص مفردة) وهي تمثل ما بداخلها حرفيا
أما الثانية فهي أضعف (مزدوجة) فهي تسمح بتعويض قيمة
المتغير و تقوم ب escape
لذا يمكنك استعمال التنصيص الضعيف مثلا
cd "Mohammad Ali"
ولكن إذا كان اسم المجلد $Ali
فإنه لن ينفع لأنه يقوم بالتعويض مكان Ali بقيمة المتغير
عندها نستخدم escape أو التنصيص المفرد القوي
cd '$Ali'
تحذير
لا تسمي هكذا أسماء غريبة بها رموز
مثل $?#%\ أو مسافة لأن هذا يربكك وأنت تطبع الأوامر.
ولا تخلط بين علامة التنصيص المفردة ' وعلامة تنفيذ برنامج `
وأخذ الخرج الموجودة عند عرف الذال
يستطيع BASH القيام بالعمليات الحسابية على الأرقام ومتغيّرات البيئة
من خلال let المبنية داخله و '$(( ))'
وفي كلا الحالتين لا نسبق أسماء المتغيّرات بعلامة الدولار
'$'، لاحظ هذه الجلسة:
bash$ echo $((2+3*4))
14
bash$ let a=3; let b=2*a; echo "a=$a,b=$b"
a=3,b=6
# مهداة إلى محبي لغة سي
bash$ let ++a; let b*=5; let c='(a<b)?a:b'
bash$ echo "a=$a,b=$b,c=$c"
a=4,b=30,c=4
bash$ help let | less
علامات التنصيص في "let c='(a<b)?a:b'"
حتى لا تفسر علامة أصغر على أنها تحويل للمدخلات.
في sh (مفسر Bourne shell المعياري POSIX دون إضافات)
عليك استعمال أداة خارجية، مثل أداة 'expr' جرّب:
bash$ expr 2 + 3 \* 4
14
bash$ expr substr "I love GNU/Linux." 12 5
Linux
|