home *** CD-ROM | disk | FTP | other *** search
- 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 {
- sub $AUTOLOAD {
- 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
-