السلام عليكم ورحمة الله وبركاته
آسف جدا يا أخوانى على التأخر فى وضع الشرح الكتابى لبقيت المحاضرات
لكن الحمد لله هنرجع للشرح مرة تانية
كود PHP:
Unit 7
Standard I/O and Pipes
المحاضرة هى الرابعة وتعتبر ال lab 3 فى الشرح الفيديو
ما هوا الStandard input و Standard output و Standard error
كود PHP:
Linux provides three I/O channels to Programs
Standard input (STDIN) - keyboard by default
Standard output (STDOUT) - terminal window by default
Standard error (STDERR) - terminal window by default
نرجع لأول مرة درسنا حاسب الى فى حياتنا
سمعنا عن التالى فى الهاردوير الخاص بالجهاز :
المدخلات والمخرجات والعمليات
المدخلات عبارة عن مجموعة من البيانات بتقوم بادخالها للكمبيوتر وبعدها
بتتم العمليات على المدخلات دى ثم بيكون ناتج العملية هوا المخرجات
وهى عباة عن معلومات او بيانات تم التعديل عليها لتفيد المستخدم
حتى الآن شىء جميل
ماذا يفيد هذا فى شرحنا وكلامنا السابق
عند تعاملك مع الترمنال او الشل او اللينوكس عامة تقوم بإدخال إليه مجموعة من الأوامر
هذه الأوامر هى عبارة عن ال Standard input
يعنى مثلا كتبت للشل عبارة أو أمر :
هذا هو المدخل الذى نقوم بإدخاله الى النظام او الشل
ومن ثم بعد هذا الأمر يقوم السيستم بالرد عليك بإعطائك قائمة طويلة جدا جدا جدا
رد السيستم أيا كان هوا عبارة عن Standard output وهو رد صحيح للعمليه
أى أن ما طلبته من السيستم شىء منطقى وقام بالرد عليه فى هيئة قائمة من
الملفات والتصاريح الخاصة بها والملفات أسفل المسارات بكافة الأشكال
ولكن لنفرض أننا قمنا بإعطاء السيستم أمر ما ونتج عنه مجموعة من الأخطاء التى ظهرت لك فى نافذة الترمينال
يعتبر هذا الخطأ الظاهر لك هوا عبارة عن Standard error
وليكن مثلا :
كود PHP:
ls -alR /kimotopalansary
ls: cannot access /kimotopalansary: No such file or directory
ناتج العملية السابقة كما هوا ظاهر لديك السيستم يخبرك بعدم وجود هذا المسار
انتهينا من النقطة الأولى
كود PHP:
Redirecting Output to a File
ما معنى السطر السابق
هو تحويل المخرجات الى ملف معين أو إلى مسار معين
فمثلا :
عند تنفيذ الأمر التالى :
يكون الناتج كبير جدا جدا لدرجة انى لن أستطيع قراءة كامل الناتج ولهذا فأنا لاأستفيد بالأمر الذى أعطيته للنظام
وهنا أقوم بعمل أمر للسيستم أوجه فيه له أن يخرج لى المخرجات إما ى ملف أو يظهر مجزء على الشاشة على قدر حجم الشاشة فقط
أى أننى أقوم بتحويل المخرجات الى مكان معيا فى النظام او الى ملف معين او اقوم باخراجه الى عمليه أخرى مثلا
دعنا نستعرض مثال :
كود PHP:
ls -alR /etc >/root/kareem.txt
قم بالذهاب الى المسار /root ثم قم بعرض الملف kareem.txtماذا تلاحظ ؟؟؟
ظهور قائمة بكافة ملفات السيستم فى المسار الذى طلبت منه استعراضهاموجودة فى قائمة داخل الملف
كيف حدث هذا
حدث عن طريق تحويل المخرجات كلها الى ملف موجود فى مسار معين واذا كان الملف غير موجود يقوم السيستم بإنشاؤه لك
بمعنى آخر : كيف يمكننى التعامل مع هذه الإختصارات ؟؟؟ وكيف يتم كتابتها ؟ وما المفيد فيها ؟؟؟
كود PHP:
# > Redirect STDOUT to file
تقوم هذه العلامة بتوجيه المخرجات الصحيحة عن طريق العلامة التالية ( < ) وتقوم بتحويل ال standard output الى المسار المذكور فى الأمر
هذه العلامة تقوم بتحويل ال ( <2 ) ال Standard error الى ملف معين او مسارا معينا وهى المخرجات الخاطئة الى مسار معين
بينما هذه العلامة
كود PHP:
&> Redirect all output to file
تقوم بتحويل كامل الoutput الى مسار او الى ملف معين
ما فائدة تحويل الإيرور الناتج عن عمليه ما الى ملف معين ؟؟؟؟
احيانا تحتاج الى معرفة كافة البيانات الخاصة بالايرور لتعرف كيفية التغلب على هذا الايرور ومعرفة السبب الأساسى لوجوده
أمثلة على تحويل الايرور او تحويل ال output الى مسار معين أو تحويل الأيرور الى مسار معين
كود PHP:
ls -l /etc | less
هنا يقوم النظام باخراج ناتج الامر جزء صغير و جزء صغير على حسب حجم الشاشة او الترمينال عندك
فيظهر صفحة صفحة وتتحرك فيه بالاسهم او بالبكره فى الماوس
كود PHP:
ls -l /root/kareem >kimo.txt
يقوم الامر السابق بنقل ناتج الأمر الى ملف معين لديك فى النظام وبفتح الملف يظهر لك كافة الناتج الخاص بالامر
كود PHP:
ls -alR /dev/1kjfdvasd /etc 2>kimo.txt >kimo1.txt
الامر هنا عبارة عن طلب من السيستم بعرض محتويات مسارين مختلفين وهما
كود PHP:
/dev/1kjfdvasd
/etc
ثم توجيه ناتج كل عمليه منهما الى ملف معين فالايرور يتم تحويله الى kimo.txt والناتج الصحيح يتم تحويله الى kimo1.txt
هنا نلاحظ أن المسار المطلوب عرض الملفات بيه غير موجود اصلا وهذا ينتج عنه إيرور معين والمسار الاخر يكون له ناتج فيقوم الملف بتوجيه الايرور الى الملف kimo.txt والناتج الصحيح يقوم بتوجيهه الى الملف kimo1.txt
وفى الامر التالى يمكننا توجيه كافة النواتج الى ملف معين وهنا يقوم بتوجيه الايرور والناتج الصحيح الى هذا الملف كما يلى outputall
كود PHP:
# ls -alR /dev/1kjfdvasd /etc &>outputall.txt
ولكن تظهر لنا مشكلة وهى ان كلما يتم إضافة ايرور معين او ناتج عمليه صحيحه معين الى ملف يتم حذف السابق فى الملف والكتابه من جديد ( يعنى بيمسح ويكتب من الاول جرب وشوف كالتالى ):
كود PHP:
1-#ls -l /root >1.txt
2-#cat 1.txt
3-#ls -l /etc >1.txt
4-#cat 1.txt |less
نلاحظ اختفاء ناتج العملية الاولى وظهور ناتج العملية التانية فقط فى الامر رقم 4
كيف يمكننى وضع كافة الأخطاء والنواتج فى ملف واحد بدون مسح محتويات الملف السابقة ؟؟؟؟
مثال يوضح كيف يتم هذا :
كود PHP:
1-#echo "Arabhardware.net">1.txt
2-#cat 1.txt
3-#echo "b7lmbeek" >>1.txt
4-#cat 1.txt
ويكون الناتج
Arabhardware.net
b7lmbeek
----
ننتقل الى أمثلة أقوى
كود PHP:
$ find /etc -name passwd
يعنى انا بقول للسيستم يدورلى جوا ال/etc عن ملف معين اسمه passwd
طبعا فى اوبشن مختلف اخر اسمه iname بحيث انى لو طلبت منه يبحث عن ملف اسمه pAsSwD فهوا هيدور على الملف دا بنفس الشكل للحروف دى وهيجيبه برده ومش هيجيب غيره
طيب نحاول تنفيذ الأمر
وطبعا بيخرج لك مكان الملف بكل بساطة
طيب نحاول ندور بشكل تانى
كود PHP:
find /etc -name passwd > fm.txt
هنا شوف الناتج للعملية دى هتلاحظ انه طلع لك كل الملفات اللى بتحتوى على كلمه passwd
كود PHP:
find /etc -name passwd > /dev/null
يعنى ايه ؟؟؟
وايه المكان الى انا وجهت له الايرور ؟؟؟؟
المكان اللى وجهت له الايرور هوا عبارة عن ثقب أسود فى السيستم يعنى اللى بيروح هناك مبيرجعش تانى او بيتمسح بشكل نهائى او بيروح للامكان
طيب مثال كمان
كود PHP:
$ find /etc -name passwd > find.out 2> find.err
الحالة دى شرحتها قبل كدا
نأتى لنقطة تانية فى الشرح وهى pipes
يعنى بيحول من ال standered out الى programm
كود PHP:
#command1 | command2 | command3... etc
يعنى مثلا ناتج عمليه انا قمت بيها فى السيستم باخد المخرجات بتاعته وبقوم بادخالها فى عمليه تانية خالص عن طريق ( ماسورة بالبلدى يعنى )
مثال بسيط
كود PHP:
cat /etc/passwd
cat /etc/passwd |grep "root"
cat /etc/passwd |grep "root" |grep "^root" |cut -f7 -d":"
هنا ببساطة الامر الاول عمل اظهار فى الشل للملف ال/etc/passwd
الامر التانى هيطلع السطر اللى فيه الكلمة اللى أمرته بيها root
السطر التالت هيجيب السطر اللى بدأ ب root
الامر الاخير هيقوم بعمل cut يعنى قطع للحقل السابعf7 حينما يكون الفاصل هوا ":"
وهنا يكون الناتج
مثال تانى :
كود PHP:
#$ echo "test email" | mail -s "test" root@kareem-desktop
هوا هنا يقوم بطباعة الامر test email
ومن ثم يقوم بتحويلها الى امر اخر نقوم بارساله الى يوزر اخر او ايميل من خلال الامر mail والاوبشن التالى له -s هوا عنوان الرساله وفى النهاية تكتب الميل الذى سيتم الارسال الرساله اليه وهوا التالى root@kareem-desktop ثم Enter
طيب وافتح الميل اللى جالى ازاى ؟؟؟؟
عن طريق الامر mutt
ولو مش شغال معاك استعمل فى الاوبنتو لينوكس
كود PHP:
#sudo apt get install mutt
ثم تقوم بالاختيار الايميل وتضغط انتر ويظهر لك محتوى الرساله ( لازم تجرب بايديك )
كود PHP:
To: root@kareem-desktop
Subject: this is testmail
From: root <root@kareem-desktop>
testmail
هنا الميل اللى انا بعته
دا ابسط مثال لل | pipe line
استعمال اخر
كود PHP:
#$ command1 | tee filename | command2
الامر السابق يقوم بتنفيذ الكوماند رقم 1 اولا ثم يقوم بتمرير الناتج عن طريق pipe line الى الامر tee الذى يقوم بدوره بإنشاء ملف يحمل كافة مخرجات الكوماند الاول ثم يقوم بتمرير الملف بالكامل الى الكوماند رقم 2 لعمل عمليه معينه عليه
مثال
كود PHP:
#cat /etc/passwd | tee kimotop | grep "root" |grep "^root" | cut -f7 -d ":"
الناتج من العملية
ثم قم بتنفيذ الامر التالى تجد أن ناتج الامر الاول يظهر بالملف بالكامل
كود PHP:
#cat kimotop |less
مثال اخر
كود PHP:
$ ( cal 2007 ; cal 2008 ) | less
ذكرنا من قبل أنه لكتابه اكثر من امر فى نفس السطر نقوم بوضع ال ; بينهم
وهنا عن طريق الأقواس التى تم وضع الامرين فيها يتم تنفيذ الامرين مرة واحدة
اما بالنسبة لبقية الامر فهو يتم إمرار الناتج للأمرين على pipe line بحيث
يكون الظاهر والناتج من العملية هوا جزء بسيط على قد الوندو الخاصة بالشل
كود PHP:
echo "kareem" |tr 'a-z' 'A-Z'
والامر tr هنا هيحول الكلمة من small الى كابتل
تعالى ننفذ حاجة مهمة جدا
وهى Sending Multiple Lines to STDIN
يعنى انا بوجه كذا سطر لعمل امر واحد
زى اسه مثلا ؟؟؟
تعالى معايا نكتب الامر التالى :
مثلا أمر الميل
كود PHP:
#mail -s "kareem write multi lines" root@kareem-desktop <<END
> Hi Jane,
>
> this is a try for anew method in linux
> eshta fa7t
>
> Details later
> krkr
> END
الملاحظ هنا ان الباش فضلت تستقبل منك أوامر بدون توقف و سابتك تكتب السطور دى كلها
لحد اما انته كتبت الكلمة END وهى نفسها اللى كتبتها فى السطر الاول
لما انته كتبتها فى السطر الاول الباش ملقتش الامر اكتمل ولا لقت لها معنى فسابتك تكتب لحد اما وصلت للجزء اللى خلصت انته فيه وقلت لها انا خلصت
طبعا END دى ممكن تكون اى حاجة تانية ان شاء الله حتى &#$@ او حتى حرف واحد
يعنى الباش بتستنى لحدا اما الامر يكمل او انته تضيف حاجة تعطى له معنى (افتراض حسن النية من الباش )
نأتى الى أداه تانية فى ال bash
وهى ال for -loop
انا عايز حاجة تتنفذ اكتر من مرة فبرميها فى اللوب دا
يعنى عايز اكريت ملف واحد اكتر من مرة او اخزن اكتر من قيمة فى اكتر من ملف
استخداماتها كتيرة جداااااااااااا
مثال :-- ......
انا عايز اكريت عشر ملفات فى فولدر معين
هعمل ايه ؟؟؟
كود PHP:
#mkdir test
#cd test
#for i in 'seq 1 10'
#do
#touch file$i
#done
اعمل بقى ls
هتلاقيه عمل عشر ملفات بنفس الاسم file مع اختلاف الاسم بالارقام اللى فى المتغير i
ال i هنا عبارة عن قيمة او variable معين ممكن يتعوض داخله باى حاجة
يعنى جوا كل i حيث ال i من 1-10 فيقوم يروح يعمل الاوامر اللى معاه مضيف عليها الجزء السابق الخاص بالتعويض عن i لحد اما يوصل للاخر العد او الهارد يتملى
يعنى لو عايز اضيف او احذف جزء على الف ملف مثلا فبقوم بعمل الاتى :
اول حاجة هجيب اسماء الملفات اللى عايز اغير فيها فى ملف مثلا krkr.txt
بعمل for واسماء الملفات وبقوله cat للملف وبعدين echo الجزء اللى عايز اضيفه ثم append او >> بحيث انه يعمل الاضافة مش يمسحهم كلهم
اتمنى أكون وفقت فى التوصيل
وطبعا كل اللى كتبته من الفيديو والملاحظات اللى بيشرحها المهندس مصطفى
اتبقى محاضرة سابقة والمحاضرة بتاعت امبارح يعنى محاضرتين وتبقوا متابعين معانا أول بأول
الفيديو موجود للى محتاجه يعنى مش كتابه بس
بالتوفيق للجميع ان شاء الله
وبحثت فى النت أثناء السهر المتواصل ووجدت كتاب ماتريال كويسة يارب تعجبكم والمهندس مصطفى يوافق عليها
حصريا لكورس الريدهات احضرت كتاب مميز Red Hat Certified Engineer Linux Study Guide
دعواتكم للمهندس مصطفى لانه بيتعب معانا جامد يا جماعة والله اكتر مما بيظهر لكم فى الفيديو
ومتنسونيش برده بدعوتين
أخوكم
كريم عبد القادر:ah40:
المفضلات