The Perl/Unix Shell Replacement Project

see also: ``Perl Power Tools: The Unix Reconstruction Project''

The pl homepage is, the latest release can be downloaded from the project page at


pl is a minimal Perl shell, providing continuations of unterminated quotations, autoloading of functions, and the option to convert line-based data to arrays on-the-fly. Unlike psh, pl does not provide sh-like constructs; all commands are valid Perl.


pl should be a complete replacement for sh(1), not in terms of commands, but functionality. Perl is a complicated program and can easily replace many small /bin commands. Why use /bin/unlink when you can use unlink()?

In the future, it may be possible to rm -rf /bin and do everything through pl (or perl) instead of sh, resulting in a sort of Perl operating system. The possibilities...


What follows is description of some things pl can do.

pl provides:

continuations of unterminated quotes

Unlike psh, which prefixes its continatuion prompt with ``>'', and Python, which prefixes its with ``...'', pl sets the continuation prompt to the token that would match end of the quotation. Here are some examples:

    #! "foo
    "? bar"
    #! qq( 
    )? )
    #! <<EOF
    \nEOF? hello world
    \nEOF? blah blah blah
    \nEOF? EOF
    hello world\nblah blah blah\n

pl can convert the output of commands to an array

    #! ls
    0 cat\n
    1 cols\n
    2 data\n
    3 default_loader\n

ls is handled using line_loader.

non-list return a scalar

pl has its own (very simplistic) implementation of cat:

    #! cat("cat")
    autoloading main::cat: cat
    sub  # cat 

As you can see it returns a scalar.

external programs

In addition to line_loader, pl has a default loader which consists of:

    sub #default
        my ($fn, @args) = @_;
        system($fn, @args);

If you're knowledgeable at Perl, pl should be easy to figure out. Note, parenthesis are required to auto-load a function from /usr/bin (that is, until all command-line utilities are rewritten in Perl) initially. Read the source for all the details.


How can I get my current working directory? pwd doesn't work.

    use Cwd;

How can I change directories? cd doesn't work.


How can I use pipes?

| isn't allowed because it is Perl's bitwise OR operator, and pl doesn't redefine any Perl operators. You still can use pipes with open, see perlfunc(1).

How can I change my prompt?

Set $pre to any valid Perl code. This variable is eval'd before input. For example, assuming Cwd is loaded:

    $pre = q(print getcwd(), "#! ")      # set to current directory + #!

You can also set $post, it is evaluated after each command. By default, $post is print "\n".

$pre_more is evaluated before inputting each line of continued input, by default it prints the terminator and a question mark.

Command-line editing?

At the moment this is very minimal, GNU readline isn't used. Patches welcome.

How do I get the output of the previous command?


How do I access the previous command?


Internally, pl reads input into $in and saves it to $_ after the command is finished; accessing $in can be self-referential and this may cause problems, so just access $_.

How can I exit?

Type your EOF character (^D on Unix, ^Z on Windows). This will work even if completing an incomplete quotation.


pl is very small and incomplete, if you're looking for a Perl-based shell for day-to-day use, psh is much better. psh does many things one would expect in a shell, including pipes, space-separated command line arguments, the works. Get it at or

For an all-in-one program, capable of performing all basic system tasks, pl is suitable (Perl supports most system calls), although BusyBox is a better choice for embedded systems. Perl isn't small. BusyBox is available at


Jeff Connelly <>

Feedback is welcome.