Article 10935 of comp.lang.perl:
Path: feenix.metronet.com!news.ecn.bgu.edu!usenet.ins.cwru.edu!gatech!swrinde!cs.utexas.edu!uunet!sybus.sybus.com!myrddin!pdn!bcutter
From:
[email protected] (Brooks Cutter)
Newsgroups: comp.lang.perl
Subject: Perl shell (iperl)
Date: 24 Feb 1994 00:07:50 GMT
Organization: AT&T Paradyne, Largo Florida
Lines: 109
Message-ID: <
[email protected]>
NNTP-Posting-Host: natas.paradyne.com
A number of people have been looking for a Perl Shell. I picked this
up off the net a while back, it was written by Cameron Simpson and
allows you to execute perl a line at a time...
The only thing I miss in it is history with gnu readline support...
#!/usr/local/bin/perl
#
# Interactive Perl.
#
# ! command Pass command to shell. $val <== $?
# ? Print $val.
# perl stuff $val <== eval 'perl stuff'
#
# Multiline perl text uses slosh extension.
# - Cameron Simpson <
[email protected]>, 23feb93
#
require 'flush.pl';
($cmd=$0) =~ s:.*/::;
$tty=(-t STDIN);
$ps1=$cmd.'> ';
$ps2=(' ' x length($cmd)).'> ';
defined($ENV{'SHELL'}) || ($ENV{'SHELL'}='/bin/sh');
$SIG{'INT'}='IGNORE';
$xit=0;
$val=0;
MAINLOOP:
while (&flush(STDOUT), ($tty && print STDERR $ps1), defined($_=<STDIN>)) {
tr/\n//d;
s/^\s+//;
# slosh extension
while (/\\$/) {
s/\\$//;
if (($tty && print STDERR $ps2), defined($line=<STDIN>)) {
$line =~ tr/\n//d;
$_.="\n".$line;
} else {
print STDERR "$cmd: unexpected EOF\n";
$xit=1;
last MAINLOOP;
}
}
if (/^!/) {
s/^!//;
$val=&shellcmd($_);
} else {
s/\s+$//;
if ($_ eq '?') {
print $val, "\n";
} else {
$val=eval $_;
if ($@) {
print STDERR "eval: $@\n";
$xit=1;
} else {
$xit=($val == 0);
}
}
}
}
$tty && print STDERR "\n";
exit $xit;
sub shellcmd {
local($shc)=@_;
local($xit,$pid);
if (!defined($pid=fork)) {
print STDERR "$cmd: fork fails: $!\n";
$xit=$!;
} elsif ($pid == 0) {
# child
$SIG{'INT'}='DEFAULT';
exec($ENV{'SHELL'},'-c',$shc);
print STDERR "$cmd: exec $ENV{'SHELL'} fails: $!\n";
exit 1;
} else {
# parent
local($wait);
$wait=waitpid($pid,0);
$SIG{'INT'}='IGNORE';
if ($wait == -1) {
die "no child? (waitpid: $!)";
} else {
if ($pid != $wait) {
die "waitpid($pid,0) == $wait";
} else {
$xit=$?;
}
}
}
$xit;
}
--
Brooks Cutter (I:
[email protected]) (U: ...uunet!pdn!bcutter)
Unix System Administrator, Engineering Services
AT&T Paradyne, Largo Florida
(Opinions expressed are my own and do not reflect those of my employer)