NAME
psh - Perl Shell
SYNOPSIS
A fairly simple read-eval loop. The -w
flag and 'use strict
' are not employed so that the user is not bound by their stipulations. Setting $^W = 1
will turn on warnings, and calling 'use strict
' will (almost) do the usual thing if called by the user (see LIMITATIONS, below).
DESCRIPTION
Each line of input is read and immediately evaluated.
Multiline input may be entered by starting with a line like <<XXX
, followed by lines of input not having XXX
on a line by itself, followed by such a line. If XXX
is not specified, then the first blank line terminates the input.
An input line beginning with `!' will be given as a parameter to the system()
Perl function.
An input line beginning with `.' followed by a space and a file name will cause the contents of the specified file to be read in and evaluated.
If $ENV{HOME}
is set, and the file $ENV{HOME}/.pshrc
is present, it will be read in and evaluated before processing begins. If not, but .pshrc
is present in the current directory, it will be read and executed.
PROMPT STRINGS
Setting the variable $psh::prompt
to a string will cause that string to be used as the prompt-string. Setting it to a subroutine reference causes the result of running that subroutine to be used each time. For example,
$psh::prompt = sub { $i++; "psh [$i]\$ "; }
will cause the prompt to be psh [1]$
followed by psh [2]$
, and so on.
psh
uses some of the same ``prompting variables'' as bash
. They are accessed by placing a backslash followed by the code in the prompt string, either hard coded, or as returned by the prompt string function. The variables supported are:
- d The date in ``Weekday Month Day'' format
- h The hostname
- n A carriage return and line feed
- s The name of the shell
- t The current time in HH:MM:SS format
- u The username of the current user
- w The current working directory
- W The basename of the current working directory
- # The command number of the current command
- $ `#' if the effective UID is zero, else `$'
LIMITATIONS
The loop inside psh
will clobber $1
and other variables because it uses matches to implement some of its special functions.
Very little error checking is done.
The effect of `use foo' is not as expected. Such statements, when sent to Perl's eval() function, cause eval() to return undef, which is supposed to indicate an error. Simple detection of isolated use statements could be hacked in, but it would not be general, and would therefore be fragile.
OTHER PERL SHELLS
Larry Wall exhibits the simple Perl shell while (<
) { eval; print $@; }> on page 161 of the Camel Book (2nd Edition).
Rich Graves <rcgraves@brandeis.edu> posted a comment to the original psh-0.001 announcement on http://freshmeat.net
, which contained this gem that leverages the Perl debugger: perl -d -e 1
;
FILES
psh
- The Perl Shell executable script.
.pshrc
- The user's Perl Shell `profile'. May be in $HOME
or the current directory.
AUTHOR
Gregor N. Purdy, <gregor@focusresearch.com>
CREDITS
The following people made contributions to this project.
- ReadLine Support
-
Code examples showing how to apply the Term::ReadLine package were contributed by Billy Naylor <billy.naylor@eu.net> (in his
pash.pl
program, which is his own Perl shell). - Symbol Table Dumping
-
Billy Naylor <billy.naylor@eu.net> also had an example of a symbol table printing function that was used as the starting point for the
psh
functionpsh::symbols()
. Thepsh
version adds the ability to specify a package name, and it also filters out some special variables. The implementation technique is also different from Billy's. - Prompt String Variables
-
Matthew D. Allen <s2mdalle@titan.vcu.edu> contributed an enhanced prompt string handling routine that emulates the
bash
prompt variables. This was expanded into the form now present. - Typo Spotting
-
Allan Kelly <akelly@holyrood.ed.ac.uk> found some problems with the generated documentation.
COPYRIGHT
Copyright (C) 1999 Gregor N. Purdy. All rights reserved. This script is free software. It may be copied or modified according to the same terms as Perl itself.