use IO::Pty;
sub run_in_pty {
my @cmd = @_;
my $pty = IO::Pty->new();
my $pid = fork; die "Couldn' fork: $!" unless defined $pid;
if ($pid) { # parent
$pty->close_slave();
} else { # child
my $slv = $pty->slave() or die "Couldn't get slave: $!";
close $pty;
open STDOUT, ">&".$slv->fileno() or die "Couldn't reopen STDOUT: $!";
open STDERR, ">&".$slv->fileno() or die "Couldn't reopen STDERR: $!";
exec @cmd;
die "Couldn't exec(@cmd): $!";
}
return join '', (<$pty>);
}
my $cmd = "./bsub";
my $out = run_in_pty($cmd);
print "$cmd: '$out'\n";
####
#!/usr/bin/perl
if (-t STDERR) { # connected to terminal?
print STDERR "msg-to-stderr\n";
}
print "msg-to-stdout\n";
####
$ ./bsub >output 2>&1