م/م القشرة
مخرجات ومدخلات القشرة :م/م القشرة
إذا اعتبرنا القشرة -الباش - كصندوق أسود لا يهمنا ما بداخله ... فقط يهمنا مخرجاته ومدخلاته ... لاحظنا الآتي :
جميع مخرجات القشرة ... مكانها الطبيعي هو الشاشة أو الطرفية Terminal
جميع مدخلات القشرة ... مكانها الطبيعي هو علامة المحث Command Line - Prompt
ولكن كطبيعة فطرية في جميع البرامج مفتوحة المصدر ... هو امكانية تعديل أغلب الخصائص التي يظن المستخدم احيانا انها عبارة عن مسلمات .
أولا : اعادة توجيه مخرجات القشرة :
كما اتفقنا فجميع مخرحات القشرة مكانها هو الطرفية - الشاشة يعني - ولكن ممكن توجيه هذه المخرجات إلى ملف معين ... اذا اقتضت الحاجة لذلك ...
وهذا يتم باستخدام علامة التوجية " < "
andalusy@linux-box:~$ ls > dir_listing.txt
andalusy@linux-box:~$
إذا كان الملف المدعو dir_listing.txt موجود في المجلد الحالى ... سيتم محو جميع بياناته والكتابة من جديد.
وإذا لم يكن موجودا سيتم انشاءه والكتابة فيه مخرجات الأمر ls ... إلا وهى عرض حميع محتويات المجلد الحالي .
وللأستغناء عن خاصية المسح والكتابة من جديد هذه... كحل أول: يمكن تعطيل هذه الخاصية بالأمر
andalusy@linux-box:~$ set -C
andalusy@linux-box:~$
ملحوظة : الأمر set بجميع معاملاته هو خاص ببيئة القشرة ودائما ما يستخدم لخواص كتلك السابقة ... ومن أشهر استخداماته هو الأمر reset ... عندما نلاحظ أي تصرف غير معتاد من القشرة ... تتصرف القشرة دائما بغرابة مطلقة بعض عرض محتويات ملف تنفيذي Binary Executable Files أو ملفات تحتوي على تكويد UTF كأغلب اللغات الآسيوية والعربية
والحل الثاني : هو استخدام علامة التوجية والإلحاق في نفس الوقت "<<"
andalusy@linux-box:~$ ls >> dir_listing.txt
andalusy@linux-box:~$
وهنا سيكون الإختلاف عن الأمر السابق بعلامة توجيه واحدة فقط ... أن الملف إذا كان موجودا سيتم إلحاق البيانات وليس مسحها والكتابة من جديد
ثانيا : اعادة توجيه مدخلات القشرة :
أيضا كما اتفقنا المكان الطبيعي لمدخلات القشرة هو سطر الأوامر ذات نفسه
andalusy@linux-box:~$ head < /proc/cpuinfo
PROCESSOR : 4
VENDOR_ID : GENUINEINTEL
CPU FAMILY : 175
MODEL : 2
MODEL NAME : INTEL(R) PENTIUM(R) XX CPU 21.740GHZ
STEPPING : 4
CPU MHZ : 199700.109
CACHE SIZE : 1024 MB
FDIV_BUG : NO
HLT_BUG : NO
andalusy@linux-box:~$ head /proc/cpuinfo
PROCESSOR : 4
VENDOR_ID : GENUINEINTEL
CPU FAMILY : 175
MODEL : 2
MODEL NAME : INTEL(R) PENTIUM(R) XX CPU 21.740GHZ
STEPPING : 4
CPU MHZ : 199700.109
CACHE SIZE : 1024 MB
FDIV_BUG : NO
HLT_BUG : NO
***طبعا الكل يتمنى أن يمتلك مثل هذا المعالج الخرافي ... ولكن للأسف لا يمكن ... لأنه ببساطة خرافة
طبعا لاحظنا أنه لافائدة حقيقة من اعادة مدخلات القشرة ... لأن أغلب الأوامر تقبل أسم الملف كمعامل من معاملات الأمر ... ولكن تظل له فوائد قد تظهر مع مرور الوقت بإذن الله
قد يصادف المرء أداة على القشرة لا تستطيع قبول مدخلاتها كمعامل من المعاملات .. وحينها يجب أن نتذكر اعادة توجيه المدخلات
ثالثا: مخرجات رسائل الخطأ :
على الرغم أنه تم إجمال جميع مخرجات القشرة في البند الأول ... إلا أنه يوجد نوع من مخرجات القشرة مخصص له مسار معين ألا وهو مخرجات رسائل الخطأ ... وبالطبع مكانها الطبيعي هو الطرفية ... الشاشة ... ولكن تحتوي على معلومات مختلفة بالطبع ... وفي كثير من الأحيان تكون جديرة بالمتابعة أكثر من أي مخرجات متابعة أو تسجيل خاصة بجميع مكونات النظام ... ولذلك خصص لها مسار خاص
andalusy@linux-box:~$ ls /dir_not_found
ls: cannot access /dir_not_found: No such file or directory
andalusy@linux-box:~$ ls /dir_not_found > f
ls: cannot access /dir_not_found: No such file or directory
andalusy@linux-box:~$ ls /dir_not_found > f 2>error.txt
andalusy@linux-box:~$ cat error.txt
ls: cannot access /dir_not_found: No such file or directory
andalusy@linux-box:~$ ls /dir_not_found > f 2>&1
andalusy@linux-box:~$ cat f
ls: cannot access /dir_not_found: No such file or directory
andalusy@linux-box:~$
كما يتضح بالمثال ... أولا يتم محاولة عرض مجلد غير موجود بالنظام أصلا ... فتظهر لنا رسالة من النظام تفيد أن هذا المجلد غير موجود أصلا
ومن ثم يتم اعادة توجيه هذا الرسالة إلى الملف error.txt
وأخيرا يتم توجية كلا المسارين ... مسار المخرجات ومسار رسائل الخطأ إلى الملف file ليعرض ويتبن أن محتوياته نفس محتويات الملف error.txt ..
الرمز "<" ... هو رمز التوجيه المستخدم من البداية
الرمز " &<" ... يستخدم هذا الرمز ليدل على العطف ... لأن المراد في هذا الأمر هو توجيه مخرجات القشرة و مخرجات الخطأ كليهما إلى الملف file
يتبقى الرقم 1 والرقم 2
مخرجات الخطأ stderr ... تميز بالرقم 2
مخرجات القشرة كلها stdout ... تميز بالرقم 1
مدخلات القشرة stdin ... تميز بالرقم 0
ومفهوم هذه الأرقام ... خاص بالأرقام التي تخصصها النواة Kernel لهذه المسارات الأساسية والحيوية ... فكل مسار له رقم مميز file descriptor
وعامة جميع ملفات نظام اليونكس تحمل هذا الرقم المميز ... file descriptor
andalusy@linux-box:~$ cat /dev/fd/
0 2 3 40 42 44 46 48 50 52 54 56 58 60 62
1 255 39 41 43 45 47 49 51 53 55 57 59 61 63
andalusy@linux-box:~$ cat /dev/fd/
استخدام المحاور Pipes :
المحور دائما ما يستخدم لوصل علاقة مقطوعة ما بين طرفين ... وهذا تحديدا ما يحدث
فمن الممكن استخدام مخرجات أمر معين لمعالجتها مرة أخرى والحصول على نتائج غير متصورة بالمرة
andalusy@linux-box:~$ ls /bin | more
andalusy@linux-box:~$ rpm -qa | grep -i qemu
andalusy@linux-box:~$ dpgk -l | grep -i gcc
andalusy@linux-box:~$ head /proc/cpuinfo | tr a-z A-Z
وبالطبع عدد مرات استخدام المحاور غير محدد إلا بطبيعة الأوامر التي سيتم وضعها في هذه السلسلة الخلاقة
المتسلسلات Lists :
عبارة عن مجموعة من الأوامر متسلسلة -- مرصوصة بعضها وراء البعض بعلاقة معينة --
المتسلسة المقطوعة :
أكثر متسلسة مستخدمة في عالم سطر الأوامر لأنك دائما ما تكتب الأمر ثم تضغط رجوع ENTER ... وهذا أول رمز قاطع
علامة الفاصلة المنقوطة semicolon ... تعتبر قاطع أيضا
وأخيرا علامة & ... تعتبر قاطع هي أيضا
andalusy@linux-box:/bin$ ls
bash bzless df fusermount loadkeys mt ping setpci touch zegrep
bunzip2 bzmore dir grep login mt-gnu ping6 setupcon true zfgrep
bzcat cat dmesg gunzip ls mv ps sh ulockmgr_server zforce
bzcmp chgrp dnsdomainname gzexe lsmod nano pwd sh.distrib umount zgrep
bzdiff chmod echo gzip lspci nc rbash sleep uname zless
bzegrep chown ed hostname mkdir nc.traditional readlink stty uncompress zmore
bzexe cp egrep ip mknod netcat rm su vdir znew
bzfgrep cpio false kbd_mode mktemp netstat rmdir sync which
bzgrep dash fgconsole kill more ntfs-3g rnano tailf zcat
bzip2 date fgrep ld_static mount ntfs-3g.probe run-parts tar zcmp
bzip2recover dd fuser ln mountpoint pidof sed tempfile zdiff
andalusy@linux-box:/bin$ ls ;
bash bzless df fusermount loadkeys mt ping setpci touch zegrep
bunzip2 bzmore dir grep login mt-gnu ping6 setupcon true zfgrep
bzcat cat dmesg gunzip ls mv ps sh ulockmgr_server zforce
bzcmp chgrp dnsdomainname gzexe lsmod nano pwd sh.distrib umount zgrep
bzdiff chmod echo gzip lspci nc rbash sleep uname zless
bzegrep chown ed hostname mkdir nc.traditional readlink stty uncompress zmore
bzexe cp egrep ip mknod netcat rm su vdir znew
bzfgrep cpio false kbd_mode mktemp netstat rmdir sync which
bzgrep dash fgconsole kill more ntfs-3g rnano tailf zcat
bzip2 date fgrep ld_static mount ntfs-3g.probe run-parts tar zcmp
bzip2recover dd fuser ln mountpoint pidof sed tempfile zdiff
andalusy@linux-box:/bin$ ls &
bash bzless df fusermount loadkeys mt ping setpci touch zegrep
bunzip2 bzmore dir grep login mt-gnu ping6 setupcon true zfgrep
bzcat cat dmesg gunzip ls mv ps sh ulockmgr_server zforce
bzcmp chgrp dnsdomainname gzexe lsmod nano pwd sh.distrib umount zgrep
bzdiff chmod echo gzip lspci nc rbash sleep uname zless
bzegrep chown ed hostname mkdir nc.traditional readlink stty uncompress zmore
bzexe cp egrep ip mknod netcat rm su vdir znew
bzfgrep cpio false kbd_mode mktemp netstat rmdir sync which
bzgrep dash fgconsole kill more ntfs-3g rnano tailf zcat
bzip2 date fgrep ld_static mount ntfs-3g.probe run-parts tar zcmp
bzip2recover dd fuser ln mountpoint pidof sed tempfile zdiff
[1] 7511
[1]+ Done ls --color=auto
andalusy@linux-box:/bin$
المتسلسة الشرطية :
command1 && command2
شرطية لأن الأمر الثاني لن يتم تنفيذه إلا إذا تم تنفيذ الأمر الاول بنجاح
andalusy@linux-box:~$ ls -l file && rm -rf file
لن يتم مسح الملف file .. إلا إذا تم عرضه
المتسلسلة الغير شرطية :
commad1 || command2
غير شرطية لأن تنفيذ الأمر التاني لا يعتمد على تنفيذ الأمر الأول ...حتى لو فشل تنفيذ الأمر الأول سيتم تنفيذ الأمر الثاني
andalusy@linux-box:~$ ls -l file || touch file
تم عرض الملف أو لم يتم عرضه ... سيقوم الأمر التالي بعمل ملف جديد اسمه file
كود الإنهاء Exit Status :
توجب عليك أن تسأل ماذا يعني أن يتم أمر بنجاح ... أو لا يتم أمر أصلا ... وكيف يمكن أن نتبين حالة تنفيذ أمر معين ...
عامة في نظام اليونكس عامة وكمفهوم مسحوب من عالم برمجة السي ... فكل أداة أو أمر -- دالة function -- تقوم بتنفيذ أمر معين أو مهمة مخصصة ... يجب عند انهاء عملها وقبل أن تنمحى تماما من الذاكرة أن تبعث لمن قام بتشغيلها في حالتنا "القشرة" وفي حالة برمجة السي دالة الأصل main() Function .... بكود معين يدل على حالة خروج هذه الأداة
- خروج ناجح ١٠٠٪ دونما أدنى خطأ
- خروج ناجح ولكن مع تحذيرات معينة
- خروج فاشل أصلا ولم يتم تنفيذ المهمة المطلوبة أصلا ...
على طريقة [بلغ -->علم] [هل تسمعني-حول --> نعم أسمعك-حول ]
وما فائدة هكذا تقنية ؟
يكفى كبروتوكول اتصال بين مكونات واداوت النظام الواحد ... ودليل متابعة وكشف أولي عن أسباب أو مناط النجاح من عدمه ...
عودة إلى القشرة في حالتنا ...
تفصيل توثيق هذه الأرقام موجود في توثيق كل أمر تحت قسم EXIT STATUS
ولكن كيف يمكن لي معرفة قيمة كود أنهاء أمر معين ؟
يتم تسجيل كود انهاء آخر أمر تم تنفيذه على سطر أوامر الباش في المتغير ?$
... واضحة جدا الجملة ... آخر أمر فقط تم تنفيذه
andalusy@linux-box:~$ ls -l
andalusy@linux-box:~$ echo $?
0
andalusy@linux-box:~$
أخيرا ... قيمة صفر لكود الأنهاء تعني النجاح المطلق والباهر في عالم اليونكس ... وهذا كعرف تقليدي من بداية بناء لغة السي أصلا
يارب نجيب صفر دايما ... وارحم ياربي من علم العالم ماهية الصفر !!!!
هذه المقالة تحتوي على مصطلحات تعريبية عديدة جزلة ... ولذلك أي تعديلات أو تعقيبات أو توضيحات لهذه الألفاظ المعربة هو في خانة "أيما ترحيب "
