⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.pm

📁 MSYS在windows下模拟了一个类unix的终端
💻 PM
字号:
package Shell;use 5.005_64;use strict;use warnings;our($capture_stderr, $VERSION, $AUTOLOAD);$VERSION = '0.3';sub new { bless \$VERSION, shift } # Nothing better to blesssub 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"};    }}sub AUTOLOAD {    shift if ref $_[0] && $_[0]->isa( 'Shell' );    my $cmd = $AUTOLOAD;    $cmd =~ s/^.*:://;    eval <<"*END*";	sub $AUTOLOAD {	    if (\@_ < 1) {		\$Shell::capture_stderr ? `$cmd 2>&1` : `$cmd`;	    } elsif ('$^O' 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 {		my \$a;		my \@arr = \@_;		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"		    #   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;		open(SUBPROC, join(' ', '$cmd', \@arr, '|'))		    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;		}	    }	}*END*    die "$@\n" if $@;    goto &$AUTOLOAD;}1;__END__=head1 NAMEShell - run shell commands transparently within perl=head1 SYNOPSISSee 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 wroteHere'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 currentpackage (and uncovered a bug in Beta 3, by the way).  Maybe the usualusage should be    use Shell qw(echo cat ps cp);LarryIf you set $Shell::capture_stderr to 1, the module will attempt tocapture the STDERR of the process as well.The module now should work on Win32. JendaThere seemed to be a problem where all arguments to a shell command werequoted before being executed.  As in the following example: cat('</etc/passwd'); ls('*.pl');really turned into: cat '</etc/passwd' ls '*.pl'instead of:  cat </etc/passwd  ls *.pland of course, this is wrong.I have fixed this bug, it was brought up by Wolfgang Laun [ID 20000326.008]Casey=head2 OBJECT ORIENTED SYNTAXShell now has an OO interface.  Good for namespace conservation and shell representation. use Shell; my $sh = Shell->new; print $sh->ls;Casey=head1 AUTHORLarry WallChanges by Jenda@Krynicky.cz and Dave Cottle <d.cottle@csc.canterbury.ac.nz>Changes and bug fixes by Casey Tweten <crt@kiski.net>=cut

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -