English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

إعادة توجيه الدخول والخروج في الشل

معظم أوامر نظام UNIX تأخذ المدخلات من محطة التشغيل الخاصة بك وترسل النواتج إلى محطة التشغيل الخاصة بك. عادةً ما يستقرأ الأمر المدخلات من مكان يُدعى المدخل القياسي، بشكل افتراضي، هذا هو محطة التشغيل الخاصة بك. نفس الشيء، عادةً ما يكتب الأمر النواتج إلى مكان يُدعى المخرج القياسي، بشكل افتراضي، هذا هو محطة التشغيل الخاصة بك.

قائمة أوامر التوجيه كالتالي:

أمر شرح
command > file توجيه الناتج إلى file.
command < file توجيه المدخلات إلى file.
command >> file توجيه الناتج بطرق إضافية إلى file.
n > file توجيه ملف وصف ملف n إلى file.
n >> file توجيه ملف وصف ملف n بطرق إضافية إلى file.
n >& m دمج ملفي m وn.
n <& m دمج ملفي m وn.
<< tag استخدام المحتوى بين العلامات البدءية tag والعلامات النهائية tag كمدخل.

الشيء المهم هو أن ملف الت描述ة 0 هو المدخل القياسي (STDIN)، 1 هو الإخراج القياسي (STDOUT)، و2 هو إخراج الأخطاء القياسي (STDERR).

توجيه الناتج

يتم تنفيذ التوجيهات بشكل عام من خلال إدراج رموز معينة بين الأوامر. خاصةً، نمط هذه الرموز كالتالي:

command1 > file1

يتم تنفيذ هذا الأمر لتنفيذ command1 ثم حفظ نواتج الأمر في file1.

الرجاء الانتباه: سيتم استبدال محتويات file1 الموجودة حاليًا بالمحتوى الجديد. إذا كنت ترغب في إضافة المحتوى الجديد في نهاية الملف، استخدم علامة >>.

مثال على-line

تنفيذ الأمر who التالي، سيتم توجيه نواتج الأمر الكاملة إلى ملف المستخدمين (users):

$ who > users

بعد تنفيذ الأمر، لن تتمكن من رؤية المعلومات في الطرفية، لأن الناتج تم توجيهه إلى الجهاز المعيّن للإخراج القياسي (الطرفية).

يمكنك استخدام الأمر cat لعرض محتويات الملف:

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33

سيقوم توجيه الناتج بتغطية محتويات الملف، انظر المثال التالي:

$ echo "موقع دروس الأساسيات: ar.oldtoolbag.com" > users
$ cat users
موقع دروس الأساسيات: ar.oldtoolbag.com
$

إذا لم تكن ترغب في تغطية محتويات الملف، يمكنك استخدام >> لجعلها تضيف إلى نهاية الملف، مثلًا:

$ echo "موقع دروس الأساسيات: ar.oldtoolbag.com" >> users
$ cat users
موقع دروس الأساسيات: ar.oldtoolbag.com
موقع دروس الأساسيات: ar.oldtoolbag.com
$

توجيه المدخل

مثل توجيه الناتج، يمكن لـ Unix commands أيضًا الحصول على المدخل من الملف، ويكون النمط كالتالي:

command1 < file1

بهذا الشكل، سيتم تحويل الأمر الذي كان يتطلب المدخل من لوحة المفاتيح إلى قراءة المحتوى من الملف.

الرجاء الانتباه: يتم توجيه الناتج باستخدام زر (>)، بينما يتم توجيه المدخل باستخدام زر (<).

مثال على-line

باستمرار في المثال السابق، نحتاج إلى حساب عدد الأسطر في ملف users، ننفذ الأمر التالي:

$ wc -l users
       2 users

يمكن أيضًا توجيه المدخل إلى ملف users:

$ wc -l < users
       2

الرجاء الانتباه: نتائج المثالين السابقين مختلفان: في المثال الأول، سيتم عرض اسم الملف؛ لا في المثال الثاني، لأنه يعرف فقط أن يقرأ المحتوى من المدخل القياسي.

command1 < infile > outfile

استبدال الإدخال والإخراج في نفس الوقت، تشغيل command1، من ملف infile، ثم كتابة الإخراج إلى outfile.

شرح توجيه عميق

في معظم الحالات، يقوم كل أمر Unix/Linux بفتح ثلاثة ملفات عند تشغيله:

  • ملف الإدخال المعياري (stdin):وصف ملف stdin هو 0، يقرأ البرامج Unix البيانات بشكل افتراضي من stdin.

  • ملف الإخراج المعياري (stdout):وصف ملف stdout هو 1، يوجه البرامج Unix بيانات الإخراج بشكل افتراضي إلى stdout.

  • ملف الخطأ المعياري (stderr):وصف ملف stderr هو 2، يستخدم البرامج Unix ل写入 معلومات الخطأ إلى تدفق stderr.

بالتأكيد،command > file يوجه stdout إلى file،command < file يوجه stdin إلى file.

إذا كنت ترغب في توجيه stderr إلى file، يمكنك كتابة:

$ command 2> file

إذا كنت ترغب في إضافة stderr إلى نهاية ملف file، يمكنك كتابة:

$ command 2>> file

2 يعني ملف الخطأ المعياري (stderr).

إذا كنت ترغب في توجيه stdout و stderr معًا إلى file، يمكنك كتابة:

$ command > file 2>&1
أو
$ command >> file 2>&1

إذا كنت ترغب في توجيه stdin و stdout كلاهما، يمكنك كتابة:

$ command < file1 > file2

يوجه command إدخال stdin إلى file1، ويوجه إخراج stdout إلى file2.

Here Document

Here Document هي طريقة توجيه خاصة في Shell، تستخدم لتوجيه الإدخال إلى سكربت أو برنامج Shell تفاعلي.

شكلها الأساسي كالتالي:

command << delimiter
    document
delimiter

وظيفته هي نقل محتوى delimiter بينهما (document) كمدخل لـ command.

ملاحظة:

  • يجب أن يكون delimiter في البداية عند النهاية، وليس يجب أن يكون هناك أي حرف قبل أو بعد، بما في ذلك الفراغات وtab indentation.

  • الفراغات التي قبل و بعد delimiter سيتم تجاهلها.

مثال على-line

يمكنك حساب عدد السطور في Here Document عبر أمر wc -l في سطر الأوامر:

$ wc -l << EOF
    مرحبًا بك في
    موقع تعليميات الأساس
    ar.oldtoolbag.com
EOF
3          # نتائج الخروج 3 سطر
$

يمكننا أيضًا استخدام Here Document في السكربت، مثلًا:

#!/bin/bash
# author:موقع تعليميات الأساس
# url:ar.oldtoolbag.com
cat << EOF
مرحبًا بك في
موقع تعليميات الأساس
ar.oldtoolbag.com
EOF

التنفيذ الكامل للسكربت، النتائج الخروج:

مرحبًا بك في
موقع تعليميات الأساس
ar.oldtoolbag.com

ملف /dev/null

إذا كنت ترغب في تنفيذ أمر معين دون عرض نتائج الخروج على الشاشة، يمكنك إعادة توجيه الخروج إلى /dev/null:

$ command > /dev/null

/dev/null هو ملف خاص، أي محتوى يكتب إليه يتم التخلص منه؛ إذا حاولت قراءته، فإنك لن تحصل على أي شيء. ولكن ملف /dev/null مفيد للغاية، حيث يمكنك إعادة توجيه输出来 إليه، مما يؤدي إلى "منع الخروج".

إذا كنت ترغب في حجب stdout و stderr، يمكنك كتابة كما يلي:

$ command > /dev/null 2>&1

ملاحظة:0 هي المدخل القياسي (STDIN)،1 هو الخروج القياسي (STDOUT)،2 هو خروج الخطأ القياسي (STDERR).

هذه 2 و > لا يمكن أن يكون بينهما مسافة،2> يُعتبر الخطأ عند التكامل.