Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Fool a process into thinking that STDOUT is a terminal

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

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

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

        I found the current thread with the same need as the OP, and interestingly, 15+ years later with IO-Tty-1.12 / Perl 5.22.0 / Linux 4.17.19 i also get strange varying result with a simple 'ls -la': sometimes only the total line, sometimes a single line from the ls, sometimes to whole output...

        The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (8)
As of 2024-04-19 09:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found