إعادة التوجيه (الحوسبة)

التدفقات القياسية للإدخال والإخراج والخطأ

في مجال الحوسبة ، يُعدّ التوجيه شكلاً من أشكال التواصل بين العمليات ، وهو وظيفة شائعة في معظم مترجمات سطر الأوامر ، بما في ذلك مختلف أنظمة يونكس التي تُتيح إعادة توجيه التدفقات القياسية إلى مواقع يُحددها المستخدم. مفهوم التوجيه قديمٌ نسبيًا، إذ يعود إلى أقدم أنظمة التشغيل. ويمكن الاطلاع على مناقشة لأهداف تصميم التوجيه في وصف نظام الإدخال والإخراج الفرعي لنظام التشغيل Multics عام 1971. [ 1 ] مع ذلك، قبل ظهور نظام يونكس وأنابيبه ، كان التوجيه في أنظمة التشغيل صعبًا، بل ومستحيلاً في بعض الأحيان. [ 2 ]

في أنظمة التشغيل الشبيهة بنظام يونكس ، تقوم البرامج بإعادة التوجيه باستخدام استدعاء النظام dup2 (2) ، أو نظائرها الأقل مرونة ولكن ذات المستوى الأعلى في الإدخال/الإخراج القياسي ، freopen (3) و popen (3) . [ 3 ]

إعادة توجيه المدخلات والمخرجات القياسية

يتم تنفيذ إعادة التوجيه عادةً عن طريق وضع أحرف معينة بين الأوامر .

أساسي

عادةً، يكون تركيب هذه الأحرف كما يلي، حيث يُستخدم <لإعادة توجيه المدخلات، و >لإعادة توجيه المخرجات. يُنفّذ الأمر ، ويضع المخرجات في الملف file1 ، بدلاً من عرضها في الطرفية، وهي الوجهة المعتادة للمخرجات القياسية. سيؤدي هذا إلى استبدال أي بيانات موجودة في الملف file1 .command>file1

باستخدام الأمر executes ، مع اعتبار الملف file1 مصدرًا للإدخال، بدلاً من لوحة المفاتيح ، والتي هي المصدر المعتاد للإدخال القياسي.command<file1

command<infile>outfileيجمع بين القدرتين: يقرأ الأمر من ملف الإدخال ويكتب إلى ملف الإخراج

المتغيرات

لإلحاق المخرجات بنهاية الملف، بدلاً من استبدالها، يتم استخدام المعامل: .>>command1>>file1

لقراءة البيانات من ملف حرفي (ملف مضمن، يتم تمريره إلى المدخلات القياسية)، يمكن استخدام مستند هنا ، باستخدام المعامل:<<

$ tr a-z A-Z << نهاية النص > واحد اثنان ثلاثة > أونو دوس تريس > نهاية النص واحد اثنان ثلاثة أونو دوس تريس

لقراءة سلسلة نصية، يمكن استخدام سلسلة نصية مضمنة ، باستخدام المعامل: أو:<<<tra-zA-Z<<<"one two three"

$ NUMBERS = "واحد اثنان ثلاثة" $ tr a-z A-Z <<< " $NUMBERS " واحد اثنان ثلاثة

الأنابيب

سلسلة من ثلاثة برامج تعمل على طرفية نصية

يمكن تشغيل البرامج معًا بحيث يقرأ أحد البرامج مخرجات برنامج آخر دون الحاجة إلى ملف وسيط صريح. يقوم بتنفيذ الأمر 1 ، مستخدمًا مخرجاته كمدخلات للأمر 2 (يُطلق على هذه العملية عادةً اسم " التوجيه " ، حيث يُعرف الحرف " " باسم "الأنبوب").command1|command2|

يمكن تشغيل البرنامجين اللذين يُنفذان الأوامر بالتوازي، مع اقتصار مساحة التخزين على مخازن العمل المؤقتة (يسمح نظام لينكس بسعة تصل إلى 64 كيلوبايت لكل مخزن مؤقت) بالإضافة إلى مساحة العمل التي يتطلبها تنفيذ كل أمر. على سبيل المثال، لا يمكن لأمر "فرز" إنتاج أي مخرجات حتى تتم قراءة جميع سجلات الإدخال، إذ قد يكون آخر سجل مُستلم هو الأول في الترتيب المُفرز. يقوم نظام التشغيل التجريبي للدكتورة ألكسيا ماسالين، المسمى "سينثيسيس" ، بتعديل أولوية كل مهمة أثناء تنفيذها وفقًا لمدى امتلاء مخازن الإدخال والإخراج المؤقتة. [ 4 ]

ينتج عن ذلك نفس النتيجة النهائية كما هو الحال عند استخدام عمليتي إعادة توجيه وملف مؤقت، كما في:

$ command1 > tempfile $ command2 < tempfile $ rm tempfile 

لكن هنا، لا يبدأ تنفيذ الأمر الثاني (command2) إلا بعد انتهاء الأمر الأول (command1) ، ويتطلب الأمر ملفًا مؤقتًا كبيرًا بما يكفي لحفظ النتائج الوسيطة، بالإضافة إلى مساحة العمل التي تحتاجها كل مهمة. على سبيل المثال، على الرغم من أن نظام DOS يسمح باستخدام صيغة "pipe"، إلا أنه يستخدم هذا الأسلوب الثاني. لنفترض أن برنامجًا طويل الأمد يُدعى "Worker" يُنتج رسائل متنوعة أثناء عمله، وأن برنامجًا ثانيًا يُدعى "TimeStamp" ينسخ كل سجل من stdin إلى stdout ، مسبوقًا بتاريخ ووقت النظام عند استلام السجل. سينتج تسلسل كهذا طوابع زمنية فقط عند انتهاء "Worker"، مما يُظهر فقط مدى سرعة قراءة وكتابة ملف الإخراج.Worker|TimeStamp>LogFile.txt

من الأمثلة الجيدة على استخدام توجيه الأوامر دمج أمر echoمع أمر آخر لتحقيق تفاعلية في واجهة سطر أوامر غير تفاعلية، على سبيل المثال: . يقوم هذا الأمر بتشغيل عميل FTP بإدخال اسم المستخدم ، ثم الضغط على مفتاح الإدخال ، ثم تمرير الأمر .echo-e'user\npass'|ftplocalhost

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

$ cat infile | command $ echo $string | command $ echo -e 'user\npass' | ftp localhost 

يمكن استبدالها بما يلي:

$ command < infile $ command <<< $string $ ftp localhost <<< $'user\npass'

وبما echoأنه غالبًا ما يكون أمرًا داخليًا في الصدفة، فإن استخدامه لا يتعرض للانتقاد مثل الأمر cat، وهو أمر خارجي.

إعادة التوجيه من وإلى معالجات الملفات القياسية

في أنظمة يونكس المشتقة من نظام بورن الأصلي ، يمكن تعديل أول إجراءين بشكل إضافي عن طريق وضع رقم ( مُعرّف الملف ) مباشرةً قبل الحرف ؛ سيؤثر هذا على أي دفق يُستخدم لإعادة التوجيه. [ 5 ] دفقات الإدخال/الإخراج القياسية في يونكس هي: [ 6 ]

مقبضاسموصف
0stdinالمدخلات القياسية
1stdoutالمخرجات القياسية
2stderrالخطأ المعياري

على سبيل المثال، يقوم بتنفيذ الأمر ، موجهاً دفق الخطأ القياسي إلى الملف 1 .command2>file1

في الصدفات المشتقة من csh ( صدفة لغة C )، يُضاف رمز & (علامة العطف) إلى أحرف إعادة التوجيه، مما يحقق نتيجة مماثلة. والسبب في ذلك هو التمييز بين ملف باسم '1' ومخرجات النظام القياسية (stdout) . في الحالة الأولى، يُعاد توجيه مخرجات الخطأ القياسية (stderr) إلى ملف باسم ' 1 '، وفي الحالة الثانية، يُعاد توجيهها إلى مخرجات النظام القياسية (stdout).catfile2>1catfile2>&1

من الميزات المفيدة الأخرى إعادة توجيه مؤشر ملف قياسي إلى آخر. وأكثر الطرق شيوعًا هي دمج الخطأ القياسي في المخرجات القياسية، بحيث يمكن معالجة رسائل الخطأ مع المخرجات العادية (أو بدلاً منها). على سبيل المثال، سيحاول الأمر العثور على جميع الملفات التي تحمل اسم ‎.profile . عند تنفيذه بدون إعادة توجيه، سيُخرج النتائج إلى stdout والأخطاء (مثل عدم وجود صلاحية لتصفح الدلائل المحمية) إلى stderr . إذا تم توجيه المخرجات القياسية إلى ملف النتائج ، فستظهر رسائل الخطأ على وحدة التحكم. لعرض كل من النتائج ورسائل الخطأ في ملف النتائج ، ادمج stderr (المؤشر 2) في stdout (المؤشر 1) باستخدام الأمر المناسب .find/-name.profile>results2>&12>&1

إذا كان سيتم تمرير الناتج المدمج إلى برنامج آخر، 2>&1فيجب أن يسبق تسلسل دمج الملفات رمز الأنبوب، وبالتالي،find/-name.profile2>&1|less

يُعد الشكل المبسط للأمر، ولكنه غير متوافق مع معيار POSIX، (غير متوفر في Bourne Shell قبل الإصدار 4، الإصدار النهائي، أو في shell Debian Almquist القياسي المستخدم في Debian/Ubuntu): أو .command>file2>&1command&>filecommand>&file

من الممكن استخدام `redirect` 2>&1قبل >`stdout`، لكن غالبًا ما يُساء فهم النتيجة. القاعدة هي أن أي إعادة توجيه تُعيّن مُعرّف دفق الإخراج بشكل مستقل. لذا، 2>&1تُعيّن `redirect` المُعرّف 2إلى أي شيء يُشير 1إليه، والذي يكون عادةً stdout في تلك المرحلة . ثم تُعيد ` >redirect` توجيه المُعرّف 1إلى شيء آخر، مثل ملف، لكنها لا تُغيّر المُعرّف 2، الذي لا يزال يُشير إلى stdout .

في المثال التالي، تتم كتابة المخرجات القياسية إلى الملف ، ولكن يتم إعادة توجيه الأخطاء من stderr إلى stdout، أي إرسالها إلى الشاشة: .command2>&1>file

لكتابة كل من الأخطاء والمخرجات القياسية إلى الملف ، يجب عكس الترتيب. سيتم أولاً إعادة توجيه المخرجات القياسية إلى الملف، ثم سيتم إعادة توجيه الخطأ القياسي (stderr) إلى مؤشر الإخراج القياسي (stdout) الذي تم تغييره مسبقًا للإشارة إلى الملف .command>file2>&1

خطوط الأنابيب المتسلسلة

يمكن ربط رموز إعادة التوجيه والتوجيه معًا لإنشاء أوامر معقدة. على سبيل المثال، يقوم الأمر `infile` بترتيب أسطر الملف `infile` ترتيبًا معجميًا، ثم يكتب الأسطر الفريدة مسبوقة بعدد مرات ظهورها، ثم يرتب الناتج الناتج عدديًا، ويضع الناتج النهائي في الملف `outfile` . [ 7 ] يُستخدم هذا النوع من البنية بشكل شائع جدًا في البرامج النصية للصدفة وملفات الدفعات .sortinfile|uniq-c|sort-n>outfile

إعادة التوجيه إلى مخرجات متعددة

يمكن للأمر القياسي tee إعادة توجيه مخرجات أمر ما إلى عدة وجهات: . وهذا يوجه مخرجات قائمة الملفات إلى كل من المخرجات القياسية والملف xyz .ls-lrt|teexyz

انظر أيضاً

مراجع

مصادر