Shell.pm revision 7c478bd95313f5f23a4c958a745db2134aa03244
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossuse warnings;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosssub new { bless \$VERSION, shift } # Nothing better to bless
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross my $self = shift;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross no strict 'refs';
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross $cmd =~ s/^.*:://;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross eval <<"*END*";
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (\@_ < 1) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (wantarray) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross local(\$/) = undef;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # XXX this special-casing should not be needed
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # if we do quoting right on Windows. :-(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # First, escape all quotes. Cover the case where we
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # want to pass along a quote preceded by a backslash
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # (i.e., C<"param \\""" end">).
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # Ugly, yup? You know, windoze.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # Enclose in quotes only the parameters that need it:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # try this: c:\> dir "/w"
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross # and this: c:\> dir /w
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross s/"/\\\\"/g;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross \$_ = qq["\$_"] if /\\s/;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross s/(['\\\\])/\\\\\$1/g;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross or die "Can't exec $cmd: \$!\\n";
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (wantarray) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross local(\$/) = undef;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross die "$@\n" if $@;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossShell - run shell commands transparently within perl
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross=head1 SYNOPSIS
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross=head1 DESCRIPTION
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross Date: Thu, 22 Sep 94 16:18:16 -0700
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross Message-Id: <9409222318.AA17072@scalpel.netlabs.com>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross To: perl5-porters@isu.edu
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross From: Larry Wall <lwall@scalpel.netlabs.com>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross Subject: a new module I just wrote
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossHere's one that'll whack your mind a little out.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross $foo = echo("howdy", "<funny>", "world");
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross $passwd = cat("</etc/passwd");
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross print $passwd;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross print ps -ww;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossThat's maybe too gonzo. It actually exports an AUTOLOAD to the current
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosspackage (and uncovered a bug in Beta 3, by the way). Maybe the usual
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossusage should be
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross use Shell qw(echo cat ps cp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossIf you set $Shell::capture_stderr to 1, the module will attempt to
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosscapture the STDERR of the process as well.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossThe module now should work on Win32.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossThere seemed to be a problem where all arguments to a shell command were
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossquoted before being executed. As in the following example:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossreally turned into:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossand of course, this is wrong.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossI have fixed this bug, it was brought up by Wolfgang Laun [ID 20000326.008]
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross=head2 OBJECT ORIENTED SYNTAX
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossShell now has an OO interface. Good for namespace conservation
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossand shell representation.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross my $sh = Shell->new;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross print $sh->ls;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross=head1 AUTHOR
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossChanges by Jenda@Krynicky.cz and Dave Cottle <d.cottle@csc.canterbury.ac.nz>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon RossChanges and bug fixes by Casey Tweten <crt@kiski.net>