I don't think I understand what you are saying. Neither provides data to perl until you read from $file; however, it is important to note that the results of the two functions are not the same. The filehandle resulting from the open contains both STDOUT and STDERR from the command (due to the shell redirecting STDERR into STDOUT), but the filehandle resulting from the open3 will only have the STDERR from the command. This might have something to do with the amount/timing of output available.
On Mon, Jul 10, 2017 at 10:09 AM Mike Martin <redt...@gmail.com> wrote: > Thanks for that, now I have another issue. > Unlike a piped open, open 3 does not seem to produce output immediately > > Is there any way to use pipes with open3 so that the FH has content before > looping > ie: this produces output > > my $pid=open($file, "-|","$cmd{$sopts->{subname}} 2>&1") > > while > $pid=open3(undef,undef,$file,$cmdprog, @args) > > does not until you iterate over the FH > > thanks > > > > > > On 10 July 2017 at 07:13, Chas. Owens <chas.ow...@gmail.com> wrote: > >> On Sun, Jul 9, 2017, 19:37 Mike Martin <redt...@gmail.com> wrote: >> >>> Hi >>> I am trying to use Open3 to capture stderr and avoiding the shell ie: >>> my $str="-v 35 -i /data/Downloads/testinput.mp4 -c:v libx264 -preset >>> fast -crf 28 -g 25 -c:a libmp3lame -b:a 128000 -threads 4 -af >>> volume=2.5 -vf scale='352:trunc(ow/((1/sar)*dar)/2)*2',fps='fps= >>> 20',setsar='1/1' -profile:a aac_he_v2 -strict -2 -y >>> /home/mike/testopen.mp4"; >>> use Text::ParseWords; >>> @args = quotewords('\s+', "'", $str); >>> >>> use IPC::Open3; >>> >>> local(*HIS_IN, *HIS_OUT, *ERR); >>> my $cmd='ffmpeg'; >>> my $pid=open3(undef, undef, *ERR,$cmd, @args) or die print "$!"; >>> my $line; >>> >>> while (sysread ERR, $line, 256){ >>> print $line; >>> } >>> waitpid($pid, 0); >>> >>> However the output is buffered for around 2 minutes at a time rather >>> immediately being printed >>> >>> Is there any way around this >>> >> >> Are you certain the buffering is in the read from ERR and not in the >> print? STDERR is not supposed to be buffered. Try adding >> >> $| = 1; >> Near the top of your program. That will turn off any buffering of the >> Perl 5 script's STDOUT. >> >> By default, Perl 5 will buffer STDOUT if it isn't writing to a >> pseudoterminal (eg if you are piping the output of the Perl 5 script to >> something else like tee.) >> >> >> > >