home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume5 / unshar.perl < prev    next >
Internet Message Format  |  1989-02-03  |  2KB

  1. Path: xanth!nic.MR.NET!hal!ncoast!allbery
  2. From: grady@fxgrp.UUCP (Steven Grady)
  3. Newsgroups: comp.sources.misc
  4. Subject: v05i050: perl version of unshar
  5. Message-ID: <865@fxgrp.UUCP>
  6. Date: 15 Nov 88 00:32:17 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: grady@fxgrp.UUCP (Steven Grady)
  9. Organization: FX Development Group, Inc., Mountain View, CA
  10. Lines: 47
  11. Approved: allbery@ncoast.UUCP
  12.  
  13. Posting-number: Volume 5, Issue 50
  14. Submitted-by: "Steven Grady" <grady@fxgrp.UUCP>
  15. Archive-name: unshar.perl
  16.  
  17. Quick and dirty, but it works.  Additional features/bug-fixes welcome.
  18.  
  19. #! /usr/bin/perl
  20.  
  21. # usage: unshar [-v] file ... 
  22.  
  23. # Assumes the files are well-defined.
  24.  
  25. # For reasons unclear to me, the eof check prevents the
  26. # last line in the file from being executed.  This is not
  27. # a problem for most shar files.
  28.  
  29. do 'getopt.pl';
  30. do Getopt();
  31.  
  32. if ($opt_v) {
  33.     open(out, ">&stdout") || die "Can't open >&stdout";
  34. } else {
  35.     open(out, ">/dev/null") || die "Can't open >/dev/null";
  36. }
  37.  
  38. # Lots of clever changes cold be made -- find the '#!' line and
  39. # execute the program; figure out what kind of file it is
  40. # if it turns out not to be a shar; etc..  Currently it is functional.
  41.  
  42. open(sh, "|/bin/sh") || die "Can't open |/bin/sh";
  43. select(out);
  44. while (<>) {
  45.     # Give up on the shell when we see "exit 0" or at the end of the file 
  46.     if (eof || /^exit 0/) {
  47.     select(out) || die "Can't select out";
  48.     close(sh) || die "Can't close sh";
  49.     open(sh, "|/bin/sh") || die "Can't open |/bin/sh";
  50.  
  51.     # start a new shell after seeing either "/bin/sh" or "cut here"
  52.     } elsif (m#/bin/sh# || /cut here/i) {
  53.     select(sh) || die "Can't select sh";
  54.  
  55.     # otherwise, spew the output to current selection (shell, stdout, /dev/null)
  56.     } else {
  57.     print;
  58.     }
  59. }
  60.