Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Fool a process into thinking that STDOUT is a terminal

by etcshadow (Priest)
on Oct 14, 2003 at 02:46 UTC ( #299012=snippet: print w/ replies, xml ) Need Help??

Description: Fool a process into thinking that STDOUT is a terminal, when in fact it may be a file or a pipe.
This can be useful with programs like ps and w on linux... which will trunc their output to the width of the terminal, and, if they cannot detect the terminal width, use a default 80 columns. Wouldn't it be nice to say "ps -aux | grep etcshadow", and get output that looks like when you just say "ps -aux"? Well, that's the idea.

#!/usr/bin/perl -w
# Fools a process into thinking that STDOUT is a terminal,
# when in fact it may be a file or a pipe.
use IO::Pty;
use strict;
die "usage: $0 command [args]\n" unless @ARGV;

my $pty = IO::Pty->new;
my $slave = $pty->slave;
open TTY,"/dev/tty" or die "not connected to a terminal\n";
$pty->clone_winsize_from(\*TTY);
close TTY;

my $pid = fork();
die "bad fork: $!\n" unless defined $pid;
if (!$pid) {
    $slave->close();
    open STDOUT,">&=".$pty->fileno() or die $!;
    exec @ARGV;
}
else {
    $pty->close();
    while (defined (my $line = <$slave>)) {
        print $line;
    }
}
Comment on Fool a process into thinking that STDOUT is a terminal
Download Code
Replies are listed 'Best First'.
Re: Fool a process into thinking that STDOUT is a terminal
by zentara (Archbishop) on Oct 14, 2003 at 19:37 UTC
    Hi, I tried playing around with your script, and it's acting funny for me with linux, perl5.8.0. When I run something like "./pseudotty ls -la" or "./pseudotty ps -aux" ; it sometimes will run and sometimes I get no output. There dosn't seem to be any pattern to it. If I run the commands rapidly in succession, sometimes they give output, sometimes nothing. I get the same problem from an xterm or console. Any idea why?
      Hmmm... I guess it could be a version issue... I'm workin off of 5.005_03, also on linux.

      I suppose it could also have to do with this issue listed in the docs for IO::Tty

              Linux 2.2.x & 2.4.x
                 Returns EIO instead of EOF when the slave is closed.  Benign.
      
      Not sure.

      ------------
      :Wq
      Not an editor command: Wq

Back to Snippets Section

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://299012]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (6)
As of 2015-07-28 06:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (252 votes), past polls