إذا سبق لك استخدام pipe وإعادة التوجيه من خلال shell على Linux ، فمن المحتمل أنك ستحتاج أيضًا في بعض الأحيان إلى الاستفادة من الأمر tee المساعدة.
روابط سريعة
ماذا يفعل tee؟
أمر مثل
ls
سيعرض محتويات الدليل الحالي. بمعنى آخر ، فإنه يعرض هذه المحتويات على stdout (الإخراج القياسي) ، والذي يكون عادةً على شاشتك ، أو لأن نكون أكثر دقة ، هو جهاز العرض الافتراضي الخاص بك.
أمر مثل
ls > file123
سيعرض شيئا على الشاشة. ذلك لأن الإشارة >
تعيد توجيه كل الإخراج إلى ملف بدلاً من عرضه على stdout
. سيتم الآن ملء file123
بالمحتويات التي سبق عرضها على الشاشة.
لعرض محتويات الدليل الخاص بك على الشاشة وكالتابة على هذا الملف ، يمكنك استخدام أمرين. مع tee يمكنك القيام بكل من هذه الأشياء في وقت واحد.
ls | tee file123
لماذا عليك استخدم Tee إذا كان بإمكانك تشغيل أمر مماثل مرتين؟
في المثال أعلاه ، من الواضح أنك لست بحاجة إلى tee
إذا كان يمكنك تنفيذ الأمر بشكل طبيعي ثم تنفيذه مرة أخرى وإعادة توجيه الإخراج إلى ملف ما. ومع ذلك ، سوف تواجه مواقف يكون فيها الإخراج وحيدًا. تخيل سيناريو حيث تحاول تشخيص المشكلة. يمكنك تشغيل تشخيص | tee error.log
. قد تكون الأخطاء التي تحصل عليها فريدة من نوعها. تريد عرضها على الشاشة حتى تتمكن من رؤية ما يحدث أثناء اختبار الأشياء. لكنك تريد أيضًا حفظ تلك الأخطاء في ملف ، حتى تتمكن من مراجعتها لاحقًا أو لصق الإخراج في منتدى للمناقشة وسؤال الأشخاص عنها.
هناك موقف آخر ، غالبًا ما تتم مواجهته ، و ستحتاج فيه إلى tee
، وهو: تريد كتابة إخراج أمر إلى موقع حيث يمكن للمستخدم الروت فقط القراءة أو الكتابة فيه. فهذا لن ينجح.
/sbin/blkid > /root/somefile
بعد ذلك ، قد تعتقد ، “حسنًا ، بالطبع ، فقط استخدم sudo
!” وستندهش من أن هذا لا يعمل أيضًا:
sudo blkid > /root/somefile
هذا لأنه بعد تنفيذ sudo blkid
، لا تزال تسجّل دخولك كمستخدم عادي وغير أساسي. ويحاول shell
(عادةً bash
) الكتابة إلى /root/somefile
باستخدام بيانات اعتماد المستخدم العادية. لحل هذا ، يمكنك استخدام tee
:
/sbin/blkid | sudo tee /root/somefile
إلحاق النص وإعادة توجيه الأخطاء
tee
أمر مفيد ولكنه بسيط ؛ أمر أساسي | tee somefile
يكفي في معظم الأحيان. ومع ذلك ، هناك سيناريوهان قد تصادفهما ويتطلبان هذه النصائح.
أول ما يجب معرفته هو أن tee
يقوم افتراضيًا بالكتابة فوق ملف. اذا قمت بتشغيل
ls | tee somefile
وثم
ls /tmp | tee somefile
سيقوم الأمر الثاني بالكتابة فوق محتويات بعض الملفات ، وسترى فقط محتويات آخر أمر تم تنفيذه. لتغيير هذا السلوك ، يمكنك جعل tee
يقوم بإلحاق النص بدلاً من الكتابة. للقيام بذلك ، ما عليك سوى استخدام مفتاح التبديل -a
.
ls | tee -a somefile
الشيء الثاني الذي يجب معرفته هو أنه ليس كل الإخراج هو نفسه. يتم التعامل مع رسائل الخطأ بشكل مختلف ، وعلى الرغم من ظهورها على الشاشة ، إلا أنها لا تُعتبر stdout
، لذلك لن يتم ملاحظتها بواسطة tee
. (يعتبر stderr
.) هنا مثال على grep
.
grep -r L2TP /etc | tee somefile
سيتم عرض شيء مثل الصورة التالية.
رسائل رفض إذن مكتوبة إلى stderr
. الشيء الوحيد المكتوب إلى stdout هو النص المميز. لهذا السبب ستلاحظ أن محتويات “somefile
” هي ما يظهر في الصورة أدناه.
في هذه الحالة ، حيث يتم استخدام grep
للبحث عن نص ، من المفيد عدم إعادة توجيه رسائل الخطأ إلى الملف. كان هذا فقط يملء الملف مع الملفات غير الضرورية. تريد فقط أن ترى النتائج التي تم العثور عليها. ولكن عندما تحتاج إلى رسائل الخطأ ، استخدم 2> & 1
، والتي تعيد توجيه stderr
إلى stdout
.
grep -r L2TP /etc 2>&1 | tee somefile
مع هذا الأمر ، ستلاحظ أن somefile
الآن يحتوي أيضًا على رسائل الخطأ.
الخلاصة
نأمل أن يغطي هذا البرنامج التعليمي كل ما تحتاجه للحصول على أقصى استفادة من الأمر tee . ولكن إذا واجهت موقفًا تتعثر فيه مع tee
، فاترك تعليقًا أدناه ، وقد نتمكن من المساعدة.