our($capture_stderr, $VERSION, $AUTOLOAD);
sub new
{ bless \
$VERSION, shift } # Nothing better to bless
my ($callpack, $callfile, $callline) = caller;
foreach my $sym (@EXPORT) {
*{"${callpack}::$sym"} = \
&{"Shell::$sym"};
shift if ref $_[0] && $_[0]->isa( 'Shell' );
\
$Shell::capture_stderr ?
`$cmd 2>&1` : `$cmd`;
} elsif ('$^O' eq 'os2') {
local(\
*SAVEOUT
, \
*READ
, \
*WRITE
);
open SAVEOUT
, '>&STDOUT' or die;
open STDOUT
, '>&WRITE' or die;
my \
$pid = system(1, '$cmd', \
@_);
die "Can't execute $cmd: \$!\\n" if \
$pid < 0;
open STDOUT
, '>&SAVEOUT' or die;
if ('$^O' eq 'MSWin32') {
# XXX this special-casing should not be needed
# if we do quoting right on Windows. :-(
# First, escape all quotes. Cover the case where we
# want to pass along a quote preceded by a backslash
# (i.e., C<"param \\""" end">).
# Ugly, yup? You know, windoze.
# Enclose in quotes only the parameters that need it:
# try this: c:\> dir "/w"
s/\\\\\\\\"/\\\\\\\\"""/g;
\
$_ = qq["\$_"] if /\\s/;
push \
@arr, '2>&1' if \
$Shell::capture_stderr
;
open(SUBPROC
, join(' ', '$cmd', \
@arr, '|'))
or die "Can't exec $cmd: \$!\\n";
close SUBPROC
; # XXX Oughta use a destructor.
Shell - run shell commands transparently within perl
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.
$foo = echo("howdy", "<funny>", "world");
$passwd = cat("</etc/passwd");
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
use Shell qw(echo cat ps cp);
If you set $Shell::capture_stderr to 1, the module will attempt to
capture the STDERR of the process as well.
The module now should work on Win32.
There seemed to be a problem where all arguments to a shell command were
quoted before being executed. As in the following example:
and of course, this is wrong.
I have fixed this bug, it was brought up by Wolfgang Laun [ID 20000326.008]
=head2 OBJECT ORIENTED SYNTAX
Shell now has an OO interface. Good for namespace conservation
and shell representation.
Changes by Jenda@Krynicky.cz and Dave Cottle <d.cottle@csc.canterbury.ac.nz>
Changes and bug fixes by Casey West <casey@geeknest.com>