السلام عليكم ورحمة الله وبركاته

آسف جدا يا أخوانى على التأخر فى وضع الشرح الكتابى لبقيت المحاضرات

لكن الحمد لله هنرجع للشرح مرة تانية
كود PHP:
Unit 7

Standard I
/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

يعنى مثلا كتبت للشل عبارة أو أمر :

كود PHP:
ls -alR /etc 
هذا هو المدخل الذى نقوم بإدخاله الى النظام او الشل

ومن ثم بعد هذا الأمر يقوم السيستم بالرد عليك بإعطائك قائمة طويلة جدا جدا جدا

رد السيستم أيا كان هوا عبارة عن Standard output وهو رد صحيح للعمليه
أى أن ما طلبته من السيستم شىء منطقى وقام بالرد عليه فى هيئة قائمة من
الملفات والتصاريح الخاصة بها والملفات أسفل المسارات بكافة الأشكال

ولكن لنفرض أننا قمنا بإعطاء السيستم أمر ما ونتج عنه مجموعة من الأخطاء التى ظهرت لك فى نافذة الترمينال

يعتبر هذا الخطأ الظاهر لك هوا عبارة عن Standard error

وليكن مثلا :
كود PHP:
ls -alR /kimotopalansary
ls
cannot access /kimotopalansaryNo such file or directory 
ناتج العملية السابقة كما هوا ظاهر لديك السيستم يخبرك بعدم وجود هذا المسار

انتهينا من النقطة الأولى
كود PHP:

Redirecting Output to a File 
ما معنى السطر السابق

هو تحويل المخرجات الى ملف معين أو إلى مسار معين

فمثلا :
عند تنفيذ الأمر التالى :
كود PHP:
ls -alR /etc 
يكون الناتج كبير جدا جدا لدرجة انى لن أستطيع قراءة كامل الناتج ولهذا فأنا لاأستفيد بالأمر الذى أعطيته للنظام
وهنا أقوم بعمل أمر للسيستم أوجه فيه له أن يخرج لى المخرجات إما ى ملف أو يظهر مجزء على الشاشة على قدر حجم الشاشة فقط
أى أننى أقوم بتحويل المخرجات الى مكان معيا فى النظام او الى ملف معين او اقوم باخراجه الى عمليه أخرى مثلا

دعنا نستعرض مثال :
كود 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 -/etc less 
هنا يقوم النظام باخراج ناتج الامر جزء صغير و جزء صغير على حسب حجم الشاشة او الترمينال عندك
فيظهر صفحة صفحة وتتحرك فيه بالاسهم او بالبكره فى الماوس

كود PHP:
ls -/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 2find.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:
/bin/bash 
مثال تانى :
كود 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:
Toroot@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:
#/bin/bash 
ثم قم بتنفيذ الامر التالى تجد أن ناتج الامر الاول يظهر بالملف بالكامل

كود 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: