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



ما هوا الStandard input و Standard output و Standard error


رمز PHP:
<code style="white-space:nowrap"> <code> 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
</code> </code>

نرجع لأول مرة درس مفصلنا حاسب الى فى حياتنا

سمعنا عن التالى فى الهاردوير الخاص بالجهاز :

المدخلات والمخرجات والعمليات

المدخلات عبارة عن مجموعة من البيانات بتقوم بادخالها للكمبيوتر وبعدها
بتتم العمليات على المدخلات دى ثم بيكون ناتج العملية هوا المخرجات
وهى عباة عن معلومات او بيانات تم التعديل عليها لتفيد المستخدم

حتى الآن شىء جميل

ماذا يفيد هذا فى شرح طريقةنا وكلامنا السابق

عند تعاملك مع الترمنال او الشل او اللينوكس عامة تقوم بإدخال إليه مجموعة من الأوامر

هذه الأوامر هى عبارة عن ال Standard input

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

رمز PHP:
<code style="white-space:nowrap"> <code> ls -alR /etc
</code> </code>

هذا هو المدخل الذى نقوم بإدخاله الى النظام او الشل

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

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

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

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

وليكن مثلا :
رمز PHP:
<code style="white-space:nowrap"> <code> ls -alR /kimotopalansary
ls
: cannot access /kimotopalansary: No such file or directory
</code> </code>

ناتج العملية السابقة كما هوا ظاهر لديك السيستم يخبرك بعدم وجود هذا المسار

انتهينا من النقطة الأولى
رمز PHP:
<code style="white-space:nowrap"> <code>
Redirecting Output to a File
</code> </code>

ما معنى السطر السابق

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

فمثلا :
عند تنفيذ الأمر التالى :
رمز PHP:
<code style="white-space:nowrap"> <code> ls -alR /etc
</code> </code>

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

دعنا نستعرض مثال :
رمز PHP:
<code style="white-space:nowrap"> <code> ls -alR /etc >/root/kareem.txt
</code> </code>

قم بالذهاب الى المسار /root ثم قم بعرض الملف kareem.txtماذا تلاحظ ؟؟؟
ظهور قائمة بكافة ملفات السيستم فى المسار الذى طلبت منه استعراضهاموجودة فى قائمة داخل الملف

كيف حدث هذا

حدث عن طريق تحويل المخرجات كلها الى ملف موجود فى مسار معين واذا كان الملف غير موجود يقوم السيستم بإنشاؤه لك

بمعنى آخر : كيف يمكننى التعامل مع هذه الإختصارات ؟؟؟ وكيف يتم كتابتها ؟ وما المفيد فيها ؟؟؟

رمز PHP:
<code style="white-space:nowrap"> <code> # > Redirect STDOUT to file
</code> </code>

تقوم هذه العلامة بتوجيه المخرجات الصحيحة عن طريق العلامة التالية ( < ) وتقوم بتحويل ال standard output الى المسار المذكور فى الأمر

هذه العلامة تقوم بتحويل ال ( <2 ) ال Standard error الى ملف معين او مسارا معينا وهى المخرجات الخاطئة الى مسار معين

بينما هذه العلامة

رمز PHP:
<code style="white-space:nowrap"> <code> &> Redirect all output to file
</code> </code>

تقوم بتحويل كامل الoutput الى مسار او الى ملف معين


ما فائدة تحويل الإيرور الناتج عن عمليه ما الى ملف معين ؟؟؟؟

احيانا تحتاج الى معرفة كافة البيانات الخاصة بالايرور لتعرف كيفية التغلب على هذا الايرور ومعرفة السبب الأساسى لوجوده

أمثلة على تحويل الايرور او تحويل ال output الى مسار معين أو تحويل الأيرور الى مسار معين


رمز PHP:
<code style="white-space:nowrap"> <code> ls -l /etc | less
</code> </code>

هنا يقوم النظام باخراج ناتج الامر جزء صغير و جزء صغير على حسب حجم الشاشة او الترمينال عندك
فيظهر صفحة صفحة وتتحرك فيه بالاسهم او بالبكره فى الماوس

رمز PHP:
<code style="white-space:nowrap"> <code> ls -l /root/kareem >kimo.txt
</code> </code>

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

رمز PHP:
<code style="white-space:nowrap"> <code> ls -alR /dev/1kjfdvasd /etc 2>kimo.txt >kimo1.txt
</code> </code>

الامر هنا عبارة عن طلب من السيستم بعرض محتويات مسارين مختلفين وهما
رمز PHP:
<code style="white-space:nowrap"> <code> /dev/1kjfdvasd
/etc
</code> </code>

ثم توجيه ناتج كل عمليه منهما الى ملف معين فالايرور يتم تحويله الى kimo.txt والناتج الصحيح يتم تحويله الى kimo1.txt
هنا نلاحظ أن المسار المطلوب عرض الملفات بيه غير موجود اصلا وهذا ينتج عنه إيرور معين والمسار الاخر يكون له ناتج فيقوم الملف بتوجيه الايرور الى الملف kimo.txt والناتج الصحيح يقوم بتوجيهه الى الملف kimo1.txt


وفى الامر التالى يمكننا توجيه كافة النواتج الى ملف معين وهنا يقوم بتوجيه الايرور والناتج الصحيح الى هذا الملف كما يلى outputall
رمز PHP:
<code style="white-space:nowrap"> <code> # ls -alR /dev/1kjfdvasd /etc &>outputall.txt
</code> </code>

ولكن تظهر لنا مشكلة وهى ان كلما يتم إضافة ايرور معين او ناتج عمليه صحيحه معين الى ملف يتم حذف السابق فى الملف والكتابه من جديد ( يعنى بيمسح ويكتب من الاول جرب وشوف كالتالى ):
رمز PHP:
<code style="white-space:nowrap"> <code> 1-#ls -l /root >1.txt
2-#cat 1.txt
3-#ls -l /etc >1.txt
4-#cat 1.txt |less
</code> </code>

نلاحظ اختفاء ناتج العملية الاولى وظهور ناتج العملية التانية فقط فى الامر رقم 4

كيف يمكننى وضع كافة الأخطاء والنواتج فى ملف واحد بدون مسح محتويات الملف السابقة ؟؟؟؟

مثال يوضح كيف يتم هذا :
رمز PHP:
<code style="white-space:nowrap"> <code> 1-#echo "Arabhardware.net">1.txt
2-#cat 1.txt
3-#echo "b7lmbeek" >>1.txt
4-#cat 1.txt
ويكون الناتج
Arabhardware
.net
b7lmbeek
</code> </code>

----
ننتقل الى أمثلة أقوى
رمز PHP:
<code style="white-space:nowrap"> <code> $ find /etc -name passwd
</code> </code>

يعنى انا بقول للسيستم يدورلى جوا ال/etc عن ملف معين اسمه passwd
طبعا فى اوبشن مختلف اخر اسمه iname بحيث انى لو طلبت منه يبحث عن ملف اسمه pAsSwD فهوا هيدور على الملف دا بنفس الشكل للحروف دى وهيجيبه برده ومش هيجيب غيره

طيب نحاول تنفيذ الأمر
وطبعا بيخرج لك مكان الملف بكل بساطة

طيب نحاول ندور بشكل تانى

رمز PHP:
<code style="white-space:nowrap"> <code> find /etc -name passwd > fm.txt
</code> </code>

هنا شوف الناتج للعملية دى هتلاحظ انه طلع لك كل الملفات اللى بتحتوى على كلمه passwd

رمز PHP:
<code style="white-space:nowrap"> <code> find /etc -name passwd > /dev/null
</code> </code>

يعنى ايه ؟؟؟
وايه المكان الى انا وجهت له الايرور ؟؟؟؟
المكان اللى وجهت له الايرور هوا عبارة عن ثقب أسود فى السيستم يعنى اللى بيروح هناك مبيرجعش تانى او بيتمسح بشكل نهائى او بيروح للامكان

طيب مثال كمان

رمز PHP:
<code style="white-space:nowrap"> <code> $ find /etc -name passwd > find.out 2> find.err
</code> </code>

الحالة دى شرح طريقةتها قبل كدا

نأتى لنقطة تانية فى الشرح طريقة وهى pipes

يعنى بيحول من ال standered out الى programm

رمز PHP:
<code style="white-space:nowrap"> <code> #command1 | command2 | command3... etc
</code> </code>

يعنى مثلا ناتج عمليه انا قمت بيها فى السيستم باخد المخرجات بتاعته وبقوم بادخالها فى عمليه تانية خالص عن طريق ( ماسورة بالبلدى يعنى )

مثال بسيط
رمز PHP:
<code style="white-space:nowrap"> <code> cat /etc/passwd
cat
/etc/passwd |grep "root"
cat /etc/passwd |grep "root" |grep "^root" |cut -f7 -d":"
</code> </code>

هنا ببساطة الامر الاول عمل اظهار فى الشل للملف ال/etc/passwd
الامر التانى هيطلع السطر اللى فيه الكلمة اللى أمرته بيها root
السطر التالت هيجيب السطر اللى بدأ ب root
الامر الاخير هيقوم بعمل cut يعنى قطع للحقل السابعf7 حينما يكون الفاصل هوا &quot;:&quot;
وهنا يكون الناتج

رمز PHP:
<code style="white-space:nowrap"> <code> /bin/bash
</code> </code>

مثال تانى :
رمز PHP:
<code style="white-space:nowrap"> <code> #$ echo "test email" | mail -s "test" root@kareem-desktop
</code> </code>

هوا هنا يقوم بطباعة الامر test email
ومن ثم يقوم بتحويلها الى امر اخر نقوم بارساله الى يوزر اخر او ايميل من خلال الامر mail والاوبشن التالى له -s هوا عنوان الرساله وفى النهاية تكتب الميل الذى سيتم الارسال الرساله اليه وهوا التالى root@kareem-desktop ثم Enter

طيب وافتح الميل اللى جالى ازاى ؟؟؟؟

عن طريق الامر mutt
ولو مش شغال معاك استعمل فى الاوبنتو لينوكس
رمز PHP:
<code style="white-space:nowrap"> <code> #sudo apt get install mutt
</code> </code>

ثم تقوم بالاختيار الايميل وتضغط انتر ويظهر لك محتوى الرساله ( لازم تجرب بايديك )
رمز PHP:
<code style="white-space:nowrap"> <code> To: root@kareem-desktop
Subject
: this is testmail
From
: root <root@kareem-desktop>

testmail
</code> </code>

هنا الميل اللى انا بعته

دا ابسط مثال لل | pipe line

استعمال اخر
رمز PHP:
<code style="white-space:nowrap"> <code> #$ command1 | tee filename | command2
</code> </code>

الامر السابق يقوم بتنفيذ الكوماند رقم 1 اولا ثم يقوم بتمرير الناتج عن طريق pipe line الى الامر tee الذى يقوم بدوره بإنشاء ملف يحمل كافة مخرجات الكوماند الاول ثم يقوم بتمرير الملف بالكامل الى الكوماند رقم 2 لعمل عمليه معينه عليه

مثال
رمز PHP:
<code style="white-space:nowrap"> <code> #cat /etc/passwd | tee kimotop | grep "root" |grep "^root" | cut -f7 -d ":"
</code> </code>

الناتج من العملية
رمز PHP:
<code style="white-space:nowrap"> <code> #/bin/bash
</code> </code>

ثم قم بتنفيذ الامر التالى تجد أن ناتج الامر الاول يظهر بالملف بالكامل

رمز PHP:
<code style="white-space:nowrap"> <code> #cat kimotop |less
</code> </code>

مثال اخر

رمز PHP:
<code style="white-space:nowrap"> <code> $ ( cal 2014 ; cal 2014 ) | less
</code> </code>

ذكرنا من قبل أنه لكتابه اكثر من امر فى نفس السطر نقوم بوضع ال ; بينهم

وهنا عن طريق الأقواس التى تم وضع الامرين فيها يتم تنفيذ الامرين مرة واحدة
اما بالنسبة لبقية الامر فهو يتم إمرار الناتج للأمرين على pipe line بحيث
يكون الظاهر والناتج من العملية هوا جزء بسيط على قد الوندو الخاصة بالشل



رمز PHP:
<code style="white-space:nowrap"> <code> echo "kareem" |tr 'a-z' 'A-Z'
</code> </code>

والامر tr هنا هيحول الكلمة من small الى كابتل



تعالى ننفذ حاجة مهمة جدا

وهى Sending Multiple Lines to STDIN

يعنى انا بوجه كذا سطر لعمل امر واحد
زى اسه مثلا ؟؟؟

تعالى معايا نكتب الامر التالى :

مثلا أمر الميل
رمز PHP:
<code style="white-space:nowrap"> <code> #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
</code> </code>

الملاحظ هنا ان الباش فضلت تستقبل منك أوامر بدون توقف و سابتك تكتب السطور دى كلها

لحد اما انته كتبت الكلمة END وهى نفسها اللى كتبتها فى السطر الاول

لما انته كتبتها فى السطر الاول الباش ملقتش الامر اكتمل ولا لقت لها معنى فسابتك تكتب لحد اما وصلت للجزء اللى خلصت انته فيه وقلت لها انا خلصت

طبعا END دى ممكن تكون اى حاجة تانية ان شاء الله حتى &#$@ او حتى حرف واحد
يعنى الباش بتستنى لحدا اما الامر يكمل او انته تضيف حاجة تعطى له معنى (افتراض حسن النية من الباش )
نأتى الى أداه تانية فى ال bash

وهى ال for -loop

انا عايز حاجة تتنفذ اكتر من مرة فبرميها فى اللوب دا

يعنى عايز اكريت ملف واحد اكتر من مرة او اخزن اكتر من قيمة فى اكتر من ملف
استخداماتها كتيرة جداااااااااااا

مثال :-- ......
انا عايز اكريت عشر ملفات فى فولدر معين



هعمل ايه ؟؟؟
رمز PHP:
<code style="white-space:nowrap"> <code> #mkdir test
#cd test
#for i in 'seq 1 10'
#do
#touch file$i
#done
</code> </code>

اعمل بقى ls
هتلاقيه عمل عشر ملفات بنفس الاسم file مع اختلاف الاسم بالارقام اللى فى المتغير i


ال i هنا عبارة عن قيمة او variable معين ممكن يتعوض داخله باى حاجة

يعنى جوا كل i حيث ال i من 1-10 فيقوم يروح يعمل الاوامر اللى معاه مضيف عليها الجزء السابق الخاص بالتعويض عن i لحد اما يوصل للاخر العد او الهارد يتملى

يعنى لو عايز اضيف او احذف جزء على الف ملف مثلا فبقوم بعمل الاتى :

اول حاجة هجيب اسماء الملفات اللى عايز اغير فيها فى ملف مثلا krkr.txt

بعمل for واسماء الملفات وبقوله cat للملف وبعدين echo الجزء اللى عايز اضيفه ثم append او >> بحيث انه يعمل الاضافة مش يمسحهم كلهم

اتمنى أكون وفقت فى التوصيل


بالتوفيق للجميع ان شاء الله

ملحوظة : الموضوع من كتابتى ونقلته من موقع تانى انا اللى كتبته فيه برده واى مقال بنشره فى مجال اللينوكس من كتابتى الخاصة

لا تنسونا من صالح دعائكم
يرجى ذكر المصدر

والكاتب
أخوكم
كريم عبد القادر





©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى©