Perl 6
Switch branches/tags
Nothing to show
Latest commit 142fbc1 Oct 5, 2017 @LLFourn LLFourn added I'm broked msg

👻 Spook in the Shell 👻 (Spit-sh) Build Status


Spook in the Shell (Spit or Spit-sh) is a shell script compiler. It compiles a Perl 6 like language called "Spook" into /bin/sh. Current features include:

  • Basic libraries/modules
  • Compile time type checking
  • Test module for outputting TAP
  • Useful builtin classes and functions
  • Plain text logging to standard out.

Everything about the language and compiler is still experimental. It is still under heavy development.


To get a picture of where Spit is going take a look at this code.

.install unless Pkg<nc>; # install nc unless it's already there
ok Cmd<nc>,"nc command exists now"; # test the nc command is there

You can compile this for CentOS with:

spit eval --os=centos  '.install unless Pkg<nc>; ok Cmd<nc>,"nc command exists now"'

Which ouputs the following shell at the time of writing:

  e(){ printf %s "$1"; }
  exec 4>/dev/null
  installed(){ yum list installed "$1" >&4 2>&4; }
  install(){ yum install -y $1 >&4 2>&4; }
  exists(){ command -v "$1" >&4; }
  exec 3>&1
  say(){ printf '%s\n' "$1" >&3; }
  note(){ printf '%s\n' "$1" >&2; }
  die(){ note "$1" && kill "-TERM" $$ >&4; }
  ok(){ test "$1" && say "✔ - $2" || die "✘ - $2"; }
  if ! installed nc; then
    install nc
  ok "$(exists nc && e 1)" 'nc command exists now'

If you have docker installed you can test this with:

spit eval --in-docker=centos '.install unless Pkg<nc>; ok Cmd<nc>,"nc command exists now"'
✔ - nc command exists now

Unfortunately on Debian the package is named 'netcat'. Let's deal with that:

# install-nc.sp
constant Pkg $nc = on {
    Debian { 'netcat' }
    Any    { 'nc' } # the default

.install unless $nc;
ok Cmd<nc>,"nc command exists now";

And now it should work on both the RHEL and Debian families of Linux distributions.

spit  compile install-nc.sp --in-docker=debian:latest
✔ - nc command exists now


Spit is written in Perl 6 and requires rakudo and something to install Perl 6 ecosystem modules with like zef.

zef install Spit

and run

spit eval 'say "hello world"'

To check it's working.


The documentation is pretty useless at the moment because the tooling has fallen far behind the language. What exists is under: doc/.

Project Layout

  • The Perl 6 Spit compiler module is in lib
  • The actual Spit source code is under resources/src
  • The core spit modules are under resouces/core-lib (right now just Test.sp)
  • The spec tests are in spec.