home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3453 < prev    next >
Text File  |  1991-06-06  |  3KB  |  103 lines

  1. Newsgroups: comp.unix.questions,comp.unix.misc,alt.sources,comp.lang.perl
  2. From: Tom Christiansen <tchrist@convex.COM>
  3. Subject: Re: tee like program to pipe to another program?
  4. Message-ID: <1991Jun06.150109.5469@convex.com>
  5. Date: Thu, 06 Jun 1991 15:01:09 GMT
  6.  
  7.  
  8. (Put followups wherever you want -- I just didn't want them to 
  9. land in alt.sources unless they were also source.)
  10.  
  11. From the keyboard of dkeisen@leland.Stanford.EDU (Dave Eisen):
  12. :In article <1991Jun6.093939.9346@dartvax.dartmouth.edu> pete@othello.dartmouth.edu (Pete Schmitt) writes:
  13. :>Is there a tee like program that will pipe down to another program?
  14. :>
  15. :
  16. :Sure. It's called "tee".
  17. :
  18. :Something like:
  19. :
  20. :program1 | tee /dev/tty | program2
  21. :
  22. :should do what you want.
  23.  
  24. I suspect that this is not want the original poster wanted.  While its
  25. true that it does work in this case, it's not going to work if you want
  26. to "tee off" to a list of processes.
  27.  
  28. Here's a program that's a supersets of the original tee, so I think
  29. you can just put it in your own bin and call it tee; I did..  
  30.  
  31. Instead of just file specs, you can give pipe specs like this "|program".
  32. So for the simple suggestion above, the usage would be
  33.  
  34.     program1 | tee "|program2"
  35.  
  36. which isn't particularly interesting.  This is:
  37.  
  38.     program1 | tee "|program2" "|program3" "|program4"
  39.  
  40. It still understands -a for append and -i for ignoring interrupts
  41. (which I've never used), as well as a new -u for "unbuffered" output,
  42. especially useful with pipes.  You can also mix your appends and
  43. overwrites by specifying ">>file" for appending.  "file" is the same as
  44. ">file", unless the -a flag is on, in which case it's ">>file".  
  45. You can always use ">file" or ">>file" to override the default.
  46. For example, not using any defaults:
  47.  
  48. $ prog1 | tee -u ">file1" "|prog2" ">>file2" "|prog3 | prog4" ">file3" ">>file4"
  49.  
  50. prog1 runs into tee, which duplicates its output to several different
  51. places.  first, a copy goes to stdout (redirect into /dev/null if you
  52. don't want this.) file1 and file3 get overwritten, file2 and file4 get
  53. appended to, and prog2 and prog3 get run.  oh, and prog3 runs into prog4.
  54.  
  55. Program follows; not bad for ~30 lines of code, eh? :-)
  56.  
  57. --tom
  58.  
  59. #!/usr/bin/perl
  60. #
  61. # tee clone that groks process tees (should work even with old perls)
  62. # Tom Christiansen <tchrist@convex.com>
  63. # 6 June 91
  64.  
  65. while ($ARGV[0] =~ /^-(.+)/ && (shift, ($_ = $1), 1)) {
  66.     next if /^$/;
  67.     s/i// && (++$ignore_ints, redo); 
  68.     s/a// && (++$append,      redo);
  69.     s/u// && (++$unbuffer,    redo);
  70.     die "usage tee [-aiu] [filenames] ...\n";
  71. if ($ignore_ints) { 
  72.     for $sig ('INT', 'TERM', 'HUP', 'QUIT') { $SIG{$sig} = 'IGNORE'; } 
  73. }
  74. $mode = $append ? '>>' : '>';
  75. $fh = 'FH000';
  76. %fh = ('STDOUT', 'standard output'); # always go to stdout
  77. $| = 1 if $unbuffer;
  78.  
  79. for (@ARGV) {
  80.     if (!open($fh, (/^[^>|]/ && $mode) . $_)) {
  81.     warn "$0: cannot open $_: $!\n"; # like sun's; i prefer die
  82.     $status++;
  83.     next;
  84.     }
  85.     select((select($fh), $| = 1)[0]) if $unbuffer;
  86.     $fh{$fh++} = $_;
  87. while (<STDIN>) {
  88.     for $fh (keys %fh) {
  89.     print $fh $_;
  90.     } 
  91. for $fh (keys %fh) { 
  92.     close($fh) && next;
  93.     warn "$0: couldn't close $fh{$fh}: $!\n";
  94.     $status++;
  95. }
  96. exit $status;
  97. --
  98. Tom Christiansen        tchrist@convex.com    convex!tchrist
  99.         "Perl is to sed as C is to assembly language."  -me
  100.