/usr/share/perl5
NameSizeModeActions
App/-0755rm
Archive/-0755rm
Attribute/-0755rm
autodie/-0755rm
B/-0755rm
Carp/-0755rm
CGI/-0755rm
Class/-0755rm
Config/-0755rm
CPAN/-0755rm
CPANPLUS/-0755rm
DBIx/-0755rm
DBM_Filter/-0755rm
Devel/-0755rm
Digest/-0755rm
Encode/-0755rm
encoding/-0755rm
Exporter/-0755rm
ExtUtils/-0755rm
File/-0755rm
Filter/-0755rm
Getopt/-0755rm
HTML/-0755rm
I18N/-0755rm
IO/-0755rm
IPC/-0755rm
JSON/-0755rm
Locale/-0755rm
Log/-0755rm
Math/-0755rm
Memoize/-0755rm
Module/-0755rm
Net/-0755rm
Object/-0755rm
overload/-0755rm
Package/-0755rm
Params/-0755rm
Parse/-0755rm
PerlIO/-0755rm
Pod/-0755rm
pod/-0755rm
Search/-0755rm
TAP/-0755rm
Term/-0755rm
Test/-0755rm
Test2/-0755rm
Text/-0755rm
Thread/-0755rm
Tie/-0755rm
Time/-0755rm
Unicode/-0755rm
unicore/-0755rm
URI/-0755rm
User/-0755rm
vendor_perl/-0755rm
version/-0755rm
warnings/-0755rm
abbrev.pl8380644editdlrm
AnyDBM_File.pm25940644editdlrm
assert.pl12980644editdlrm
attributes.pm148770644editdlrm
autodie.pm117630644editdlrm
AutoLoader.pm149970644editdlrm
AutoSplit.pm196370644editdlrm
autouse.pm42380644editdlrm
base.pm69860644editdlrm
Benchmark.pm285300644editdlrm
bigfloat.pl73680644editdlrm
bigint.pl89590644editdlrm
bigint.pm178520644editdlrm
bignum.pm186730644editdlrm
bigrat.pl44760644editdlrm
bigrat.pm144420644editdlrm
blib.pm21060644editdlrm
bytes.pm23840644editdlrm
bytes_heavy.pl7580644editdlrm
cacheout.pl11220644editdlrm
Carp.pm76110644editdlrm
CGI.pm2614780644editdlrm
charnames.pm156700644editdlrm
complete.pl31910644editdlrm
constant.pm125280644editdlrm
CORE.pod15690644editdlrm
CPAN.pm1309070644editdlrm
CPANPLUS.pm72690644editdlrm
ctime.pl19930644editdlrm
DB.pm192020644editdlrm
DBM_Filter.pm144150644editdlrm
diagnostics.pm173800644editdlrm
Digest.pm104120644editdlrm
DirHandle.pm19370644editdlrm
dotsh.pl21750644editdlrm
Dumpvalue.pm168990644editdlrm
dumpvar.pl152750644editdlrm
English.pm44880644editdlrm
Env.pm51700644editdlrm
exceptions.pl17360644editdlrm
Expect.pm547250644editdlrm
Expect.pod437350644editdlrm
Exporter.pm185950644editdlrm
fastcwd.pl10190644editdlrm
Fatal.pm409660644editdlrm
feature.pm50920644editdlrm
fields.pm95070644editdlrm
FileCache.pm55700644editdlrm
FileHandle.pm67780644editdlrm
filetest.pm40030644editdlrm
find.pl11850644editdlrm
FindBin.pm56580644editdlrm
finddepth.pl11300644editdlrm
flush.pl6420644editdlrm
getcwd.pl14270644editdlrm
getopt.pl13220644editdlrm
getopts.pl14060644editdlrm
hostname.pl7270644editdlrm
if.pm11660644editdlrm
importenv.pl2830644editdlrm
integer.pm32660644editdlrm
less.pm30840644editdlrm
locale.pm8200644editdlrm
look.pl12550644editdlrm
Memoize.pm352950644editdlrm
newgetopt.pl22130644editdlrm
NEXT.pm184810644editdlrm
ok.pm9670444editdlrm
open.pm77400644editdlrm
open2.pl1850644editdlrm
open3.pl1850644editdlrm
overload.pm480500644editdlrm
overloading.pm18010644editdlrm
parent.pm29980644editdlrm
perl5db.pl3176820644editdlrm
PerlIO.pm111220644editdlrm
pwd.pl14780644editdlrm
Safe.pm243260644editdlrm
SelectSaver.pm10760644editdlrm
SelfLoader.pm173410644editdlrm
Shell.pm86850644editdlrm
shellwords.pl2760644editdlrm
sigtrap.pm76110644editdlrm
sort.pm60930644editdlrm
stat.pl5900644editdlrm
strict.pm37160644editdlrm
subs.pm8420644editdlrm
Switch.pm285080644editdlrm
Symbol.pm47940644editdlrm
syslog.pl48060644editdlrm
tainted.pl1640644editdlrm
termcap.pl41140644editdlrm
Test.pm288000644editdlrm
Test2.pm63930444editdlrm
Thread.pm82850644editdlrm
timelocal.pl6900644editdlrm
UNIVERSAL.pm65360644editdlrm
utf8.pm69180644editdlrm
utf8_heavy.pl80010644editdlrm
validate.pl37310644editdlrm
vars.pm23580644editdlrm
version.pm10370644editdlrm
version.pod123150644editdlrm
vmsish.pm43280644editdlrm
warnings.pm161330644editdlrm
Edit: /usr/share/perl5/Shell.pm (8685B)
package Shell; use 5.006_001; use strict; use warnings; use File::Spec::Functions; our($capture_stderr, $raw, $VERSION, $AUTOLOAD); $VERSION = '0.72_01'; $VERSION = eval $VERSION; sub new { bless \my $foo, shift } sub DESTROY { } sub import { my $self = shift; my ($callpack, $callfile, $callline) = caller; my @EXPORT; if (@_) { @EXPORT = @_; } else { @EXPORT = 'AUTOLOAD'; } foreach my $sym (@EXPORT) { no strict 'refs'; *{"${callpack}::$sym"} = \&{"Shell::$sym"}; } } # NOTE: this is used to enable constant folding in # expressions like (OS eq 'MSWin32') and # (OS eq 'os2') just like it happened in 0.6 version # which used eval "string" to install subs on the fly. use constant OS => $^O; =begin private =item B<_make_cmd> $sub = _make_cmd($cmd); $sub = $shell->_make_cmd($cmd); Creates a closure which invokes the system command C<$cmd>. =end private =cut sub _make_cmd { shift if ref $_[0] && $_[0]->isa( 'Shell' ); my $cmd = shift; my $null = File::Spec::Functions::devnull(); $Shell::capture_stderr ||= 0; # closing over $^O, $cmd, and $null return sub { shift if ref $_[0] && $_[0]->isa( 'Shell' ); if (@_ < 1) { $Shell::capture_stderr == 1 ? `$cmd 2>&1` : $Shell::capture_stderr == -1 ? `$cmd 2>$null` : `$cmd`; } elsif (OS 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 = ; close READ; waitpid $pid, 0; @ret; } else { local($/) = undef; my $ret = ; close READ; waitpid $pid, 0; $ret; } } else { my $a; my @arr = @_; unless( $Shell::raw ){ if (OS 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" # and this: c:> dir /w for (@arr) { s/"/\\"/g; s/\\\\"/\\\\"""/g; $_ = qq["$_"] if /\s/; } } else { for (@arr) { s/(['\\])/\\$1/g; $_ = $_; } } } push @arr, '2>&1' if $Shell::capture_stderr == 1; push @arr, '2>$null' if $Shell::capture_stderr == -1; open(SUBPROC, join(' ', $cmd, @arr, '|')) or die "Can't exec $cmd: $!\n"; if (wantarray) { my @ret = ; close SUBPROC; # XXX Oughta use a destructor. @ret; } else { local($/) = undef; my $ret = ; close SUBPROC; $ret; } } }; } sub AUTOLOAD { shift if ref $_[0] && $_[0]->isa( 'Shell' ); my $cmd = $AUTOLOAD; $cmd =~ s/^.*:://; no strict 'refs'; *$AUTOLOAD = _make_cmd($cmd); goto &$AUTOLOAD; } 1; __END__ =head1 NAME Shell - run shell commands transparently within perl =head1 SYNOPSIS use Shell qw(cat ps cp); $passwd = cat('new; print $sh->ls('-l'); =head1 DESCRIPTION =head2 Caveats This package is included as a show case, illustrating a few Perl features. It shouldn't be used for production programs. Although it does provide a simple interface for obtaining the standard output of arbitrary commands, there may be better ways of achieving what you need. Running shell commands while obtaining standard output can be done with the C operator, or by calling C with a filename expression that ends with C<|>, giving you the option to process one line at a time. If you don't need to process standard output at all, you might use C (in preference of doing a print with the collected standard output). Since Shell.pm and all of the aforementioned techniques use your system's shell to call some local command, none of them is portable across different systems. Note, however, that there are several built in functions and library packages providing portable implementations of functions operating on files, such as: C, C and C, C and C, C, C, C, C etc. Using Shell.pm while importing C creates a subroutine C in the namespace of the importing package. Calling C with arguments C, C,... results in a shell command C, where the function name and the arguments are joined with a blank. (See the subsection on Escaping magic characters.) Since the result is essentially a command line to be passed to the shell, your notion of arguments to the Perl function is not necessarily identical to what the shell treats as a command line token, to be passed as an individual argument to the program. Furthermore, note that this implies that C is callable by file name only, which frequently depends on the setting of the program's environment. Creating a Shell object gives you the opportunity to call any command in the usual OO notation without requiring you to announce it in the C statement. Don't assume any additional semantics being associated with a Shell object: in no way is it similar to a shell process with its environment or current working directory or any other setting. =head2 Escaping Magic Characters It is, in general, impossible to take care of quoting the shell's magic characters. For some obscure reason, however, Shell.pm quotes apostrophes (C<'>) and backslashes (C<\>) on UNIX, and spaces and quotes (C<">) on Windows. =head2 Configuration If you set $Shell::capture_stderr to 1, the module will attempt to capture the standard error output of the process as well. This is done by adding C<2E&1> to the command line, so don't try this on a system not supporting this redirection. Setting $Shell::capture_stderr to -1 will send standard error to the bit bucket (i.e., the equivalent of adding C<2E/dev/null> to the command line). The same caveat regarding redirection applies. If you set $Shell::raw to true no quoting whatsoever is done. =head1 BUGS Quoting should be off by default. It isn't possible to call shell built in commands, but it can be done by using a workaround, e.g. shell( '-c', 'set' ). Capturing standard error does not work on some systems (e.g. VMS). =head1 AUTHOR Date: Thu, 22 Sep 94 16:18:16 -0700 Message-Id: <9409222318.AA17072@scalpel.netlabs.com> To: perl5-porters@isu.edu From: Larry Wall 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", "", "world"); print $foo; $passwd = cat(". Changes for OO syntax and bug fixes by Casey West . C<$Shell::raw> and pod rewrite by Wolfgang Laun. Rewritten to use closures rather than C by Adriano Ferreira. =cut