هل ينتظر الأمر Tee دائمًا EOF؟
-
01-07-2019 - |
سؤال
أرغب في تسجيل مخرجات الأمر إلى stdout
وكذلك إلى ملف السجل.لقد قمت بتثبيت Cygwin وأحاول استخدام tee
أمر لتحقيق هذا.
devenv mysolution.sln /build myproject "Release|Win32" | tee build.log
المشكلة هي أن tee
يبدو أنه يصر على انتظار نهاية الملف قبل إخراج أي شيء لأي منهما stdout
أو ملف السجل.وهذا يزيل المغزى من كل ذلك، وهو أن يكون لديك ملف سجل للرجوع إليه في المستقبل، ولكن أيضًا بعض الملفات stdout
التسجيل حتى أتمكن من رؤية تقدم البناء بسهولة.
tee
يبدو أن خيارات s تقتصر على --append
, --ignore-interrupts
, --help
, ، و --version
.فهل هناك طريقة أخرى للوصول إلى ما أحاول القيام به؟
المحلول
يبدو أن TEE يصر على انتظار نهاية الملف قبل إخراج أي شيء إما stdout أو ملف السجل.
لا ينبغي أن يحدث هذا بالتأكيد - فهو سيجعل نقطة الإنطلاق عديمة الفائدة تقريبًا.إليك اختبارًا بسيطًا كتبته يضع هذا تحت الاختبار، وهو بالتأكيد لا ينتظر eof.
$ cat test
#!/bin/sh
echo "hello"
sleep 5
echo "goodbye"
$ ./test | tee test.log
hello
<pause>
goodbye
نصائح أخرى
يمكنك الإخراج إلى الملف والذيل -f للملف.
devenv mysolution.sln /build myproject "Release|Win32" > build.log &
الذيل -f build.log
اكتب الشى الذى تريده!(النقطة هنا هي أن التدفق التلقائي ($|
) تم تشغيل الإعداد، بحيث يتم مسح كل سطر يتم رؤيته على الفور.وربما يكون هذا هو ما هو حقيقي tee
القيادة مفقودة.)
#!/usr/bin/perl -w
use strict;
use IO::File;
$| = 1;
my @fhs = map IO::File->new(">$_"), @ARGV;
while (my $line = <STDIN>) {
print $line;
$_->print($line) for @fhs;
}
$_->close for @fhs;
يمكنك استدعاء البرنامج النصي أي شيء تريده.اسميها perlmilktee
!:-ص