#/usr/local/bin/perl
#From: tchrist@convex.COM (Tom Christiansen)
#Subject: Re: tee like program to pipe to another program?
#Date: 6 Jun 91 15:01:09 GMT
#Reply-To: tchrist@convex.COM (Tom Christiansen)
#Organization: CONVEX Software Development, Richardson, TX
#Nntp-Posting-Host: pixel.convex.com
#
#
#(Put followups wherever you want -- I just didn't want them to 
#land in alt.sources unless they were also source.)
#
#From the keyboard of dkeisen@leland.Stanford.EDU (Dave Eisen):
#:In article <1991Jun6.093939.9346@dartvax.dartmouth.edu> pete@othello.dartmouth.edu (Pete Schmitt) writes:
#:>Is there a tee like program that will pipe down to another program?
#:>
#:
#:Sure. It's called "tee".
#:
#:Something like:
#:
#:program1 | tee /dev/tty | program2
#:
#:should do what you want.
#
#I suspect that this is not want the original poster wanted.  While its
#true that it does work in this case, it's not going to work if you want
#to "tee off" to a list of processes.
#
#Here's a program that's a supersets of the original tee, so I think
#you can just put it in your own bin and call it tee; I did..  
#
#Instead of just file specs, you can give pipe specs like this "|program".
#So for the simple suggestion above, the usage would be
#
#    program1 | tee "|program2"
#
#which isn't particularly interesting.  This is:
#
#    program1 | tee "|program2" "|program3" "|program4"
#
#It still understands -a for append and -i for ignoring interrupts
#(which I've never used), as well as a new -u for "unbuffered" output,
#especially useful with pipes.  You can also mix your appends and
#overwrites by specifying ">>file" for appending.  "file" is the same as
#">file", unless the -a flag is on, in which case it's ">>file".  
#You can always use ">file" or ">>file" to override the default.
#For example, not using any defaults:
#
#$ prog1 | tee -u ">file1" "|prog2" ">>file2" "|prog3 | prog4" ">file3" ">>file4"
#
#prog1 runs into tee, which duplicates its output to several different
#places.  first, a copy goes to stdout (redirect into /dev/null if you
#don't want this.) file1 and file3 get overwritten, file2 and file4 get
#appended to, and prog2 and prog3 get run.  oh, and prog3 runs into prog4.
#
#Program follows; not bad for ~30 lines of code, eh? :-)
#
#--tom

#/usr/bin/perl
#
# tee clone that groks process tees (should work even with old perls)
# Tom Christiansen <tchrist@convex.com>
# 6 June 91

while ($ARGV[0] =~ /^-(.+)/ && (shift, ($_ = $1), 1)) {
    next if /^$/;
    s/i// && (++$ignore_ints, redo); 
    s/a// && (++$append,      redo);
    s/u// && (++$unbuffer,    redo);
    die "usage tee [-aiu] [filenames] ...\n";
} 
if ($ignore_ints) { 
    for $sig ('INT', 'TERM', 'HUP', 'QUIT') { $SIG{$sig} = 'IGNORE'; } 
}
$mode = $append ? '>>' : '>';
$fh = 'FH000';
%fh = ('STDOUT', 'standard output'); # always go to stdout
$| = 1 if $unbuffer;

for (@ARGV) {
    if (!open($fh, (/^[^>|]/ && $mode) . $_)) {
	warn "$0: cannot open $_: $!\n"; # like sun's; i prefer die
	$status++;
	next;
    }
    select((select($fh), $| = 1)[0]) if $unbuffer;
    $fh{$fh++} = $_;
} 
while (<STDIN>) {
    for $fh (keys %fh) {
	print $fh $_;
    } 
} 
for $fh (keys %fh) { 
    close($fh) && next;
    warn "$0: couldn't close $fh{$fh}: $!\n";
    $status++;
}
exit $status;