diff options
Diffstat (limited to 'contrib/perl5/lib/Shell.pm')
-rw-r--r-- | contrib/perl5/lib/Shell.pm | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/contrib/perl5/lib/Shell.pm b/contrib/perl5/lib/Shell.pm new file mode 100644 index 000000000000..f4ef431cc54e --- /dev/null +++ b/contrib/perl5/lib/Shell.pm @@ -0,0 +1,126 @@ +package Shell; + +use Config; + +sub import { + my $self = shift; + my ($callpack, $callfile, $callline) = caller; + my @EXPORT; + if (@_) { + @EXPORT = @_; + } + else { + @EXPORT = 'AUTOLOAD'; + } + foreach $sym (@EXPORT) { + *{"${callpack}::$sym"} = \&{"Shell::$sym"}; + } +}; + +AUTOLOAD { + my $cmd = $AUTOLOAD; + $cmd =~ s/^.*:://; + eval qq { + *$AUTOLOAD = sub { + if (\@_ < 1) { + `$cmd`; + } + elsif (\$Config{'archname'} eq 'os2') { + local(\*SAVEOUT, \*READ, \*WRITE); + + open SAVEOUT, '>&STDOUT' or die; + pipe READ, WRITE or die; + open STDOUT, '>&WRITE' or die; + close WRITE; + + my \$pid = system(1, \$cmd, \@_); + die "Can't execute $cmd: \$!\n" if \$pid < 0; + + open STDOUT, '>&SAVEOUT' or die; + close SAVEOUT; + + if (wantarray) { + my \@ret = <READ>; + close READ; + waitpid \$pid, 0; + \@ret; + } + else { + local(\$/) = undef; + my \$ret = <READ>; + close READ; + waitpid \$pid, 0; + \$ret; + } + } + else { + open(SUBPROC, "-|") + or exec '$cmd', \@_ + or die "Can't exec $cmd: \$!\n"; + if (wantarray) { + my \@ret = <SUBPROC>; + close SUBPROC; # XXX Oughta use a destructor. + \@ret; + } + else { + local(\$/) = undef; + my \$ret = <SUBPROC>; + close SUBPROC; + \$ret; + } + } + } + }; + goto &$AUTOLOAD; +} + +1; +__END__ + +=head1 NAME + +Shell - run shell commands transparently within perl + +=head1 SYNOPSIS + +See below. + +=head1 DESCRIPTION + + Date: Thu, 22 Sep 94 16:18:16 -0700 + Message-Id: <9409222318.AA17072@scalpel.netlabs.com> + To: perl5-porters@isu.edu + From: Larry Wall <lwall@scalpel.netlabs.com> + Subject: a new module I just wrote + +Here's one that'll whack your mind a little out. + + #!/usr/bin/perl + + use Shell; + + $foo = echo("howdy", "<funny>", "world"); + print $foo; + + $passwd = cat("</etc/passwd"); + print $passwd; + + sub ps; + print ps -ww; + + cp("/etc/passwd", "/tmp/passwd"); + +That's maybe too gonzo. It actually exports an AUTOLOAD to the current +package (and uncovered a bug in Beta 3, by the way). Maybe the usual +usage should be + + use Shell qw(echo cat ps cp); + +Larry + + +=head1 AUTHOR + +Larry Wall + +=cut |