So, your problem was
Since OUT is connected to a pipe, you can never leave the loop until it closes, and it never closes with a bash shell (but it will with a simple command).#getresult while(<OUT>){......}
So, you need to get rid out the while(<OUT>) syntax, and switch to sysread. Something like this:
The above sucks 2k from the pipe, until there is 0 there. Be warned however, that this is not a general purpose solution to the problem. Each command can act differently, and there are a whole bunch of uncooperative commands that require a terminal to output to. These commands need a pseudo-tty ( see IO::Pty ) and can be very hard to deal with.if( sysread( OUT, my $buffer, 2048 ) > 0 ){ print $buffer }
But for most commands, a combination of IO::Select and sysread will work. Here is a small example I wrote for Tk. Here, fileevent is Tk's version of IO::Select
#!/usr/bin/perl use warnings; use strict; use Tk; use IPC::Open3; require Tk::ROText; $|=1; my $mw = new MainWindow; my $entry=$mw->Entry(-width => 80)->pack; $mw->Button(-text => 'Execute', -command => \&send_to_shell)->pack; my $textwin =$mw->Scrolled('ROText', -width => 80, -bg =>'white', -height => 24, )->pack; $textwin->tagConfigure( 'err', -foreground => 'red' ); my $pid = open3( \*IN, \*OUT, \*ERR, '/bin/bash' ) or warn "$!\n"; $mw->fileevent( \*OUT, readable => \&read_stdout ); $mw->fileevent( \*ERR, readable => \&read_stderr ); MainLoop; sub read_stdout { if( sysread( OUT, my $buffer, 1024 ) > 0 ){ $textwin->insert( 'end', $buffer ); $textwin->see('end'); } } sub read_stderr { if( sysread(ERR, my $buffer, 1024 ) > 0 ){ $textwin->insert( 'end', $buffer, 'err' ); $textwin->see('end'); } } sub send_to_shell { my $cmd= $entry->get(); print IN "$cmd\n"; }
In reply to Re^3: how to get rid of pressing control+c keys
by zentara
in thread how to get rid of pressing control+c keys
by harsha.reddy
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |