/ / एक सिस्टम () कमांड की कार्रवाई को आउटपुट करने की आवश्यकता है और एक प्रगति संकेतक है - पर्ल, पाइप, प्रगति-संकेतक

सिस्टम () कमांड की क्रिया को आउटपुट करने की आवश्यकता है और एक प्रगति संकेतक है - perl, पाइप, प्रगति-सूचक

मेरे पास एक अच्छा प्रगति सूचक है टी: आर: जी मॉड का उपयोग करके एक पर्ल सिस्टम () कमांड के लिए प्रगति संकेतक की आवश्यकता है

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++;


}