मेरे पास एक अच्छा प्रगति सूचक है टी: आर: जी मॉड का उपयोग करके एक पर्ल सिस्टम () कमांड के लिए प्रगति संकेतक की आवश्यकता है
open(my $cmd, "-|", "$command $flags_args 2>/dev/null")
or print "nAttention: Command $command $flags_args failed $!"
and return 1;
while (<$cmd>)
{
$percentage = ($cntr/$lines) * 100;
$percentage = 100 if $percentage > 100;
printf("Progress: %3d%%r", $percentage);
$cntr++;
}
close($cmd);
अब मैं अपने आउटपुट के STDOUT और STDERR को लॉग इन करना चाहता हूं। मैं पाइप आउटपुट से बहुत परिचित नहीं हूं इसलिए मैंने जोड़ने की कोशिश की:
print $LOG $cmd
तथा
print $LOG Dumper($cmd)
जबकि लूप के अंत से पहले। यह काम नहीं किया। पहला आउटपुट
GLOB(0x11df7a0)GLOB(0x11df7a0)GLOB(0x11df7a0)
दूसरा
$VAR1 = \*{"::$cmd"};
$VAR1 = \*{"::$cmd"};
$VAR1 = \*{"::$cmd"};
क्या किसी को पता है कि मैं पाइप्ड $ cmd से आउटपुट कैसे प्राप्त कर सकता हूं? $ कमांड के लिए उदाहरण = कमांड बनाएं
Making all in src
make[1]: Entering directory `/tmp"
Making all in include
make[2]: Entering directory "/tmp/2"
...
उत्तर:
उत्तर № 1 के लिए 4इसे बनाने का प्रयास करें
print $LOG $_;
या शायद बस
print $LOG;
(जबसे $_
डिफ़ॉल्ट है अगर कुछ भी निर्दिष्ट नहीं है)
समझाना: $cmd
वह फ़ाइल है जिसे आप "से पढ़ रहे हैं"; $_
क्या इससे लाइन को पढ़ा जाता है। आप इसे लिखकर स्पष्ट कर सकते हैं:
while ($line = <$cmd>) {
print $LOG $line;
...
}
जवाब के लिए 2 № 2
$cmd
आपके आदेश के आउटपुट में I / O हैंडल है, एक आंतरिक डेटा प्रकार जो प्रिंट करने के लिए बहुत मायने नहीं रखता है। आप उपयोग करना चाहते हैं <$cmd>
या readline($cmd)
इसका आउटपुट प्राप्त करने के लिए, जो आप पहले से ही अपने में करते हैं while
पाश:
while (<$cmd>) # same as: while (defined($_ = readline($cmd)))
{
# last line from command is now stored in $_
print $LOG $_;
$percentage = ($cntr/$lines) * 100;
$percentage = 100 if $percentage > 100;
printf("Progress: %3d%%r", $percentage);
$cntr++;
}