powscript - bash transpiler written in bash (coffeescript for bash)

powscript - bash transpiler written in bash (coffeescript for bash)

Travis build status

write shellscript in a powful way!


$ wget "https://raw.githubusercontent.com/coderofsalvation/powscript/master/powscript" -O /usr/local/bin/powscript && chmod 755 /usr/local/bin/powscript
$ powscript myscript.pow                          # run directly
$ powscript -c myscript.pow > myscript            # output bashscript
$ powscript -c --to sh myscript.pow > myscript.sh # output sh-script (experimental)



#!/usr/bin/env powscript
require_cmd 'echo'
require_env 'TERM'

error(msg exitcode)
  echo "error: $msg"
  if set? $exitcode
    exit $exitcode

run(@args -- foo)
  if empty? foo
    error "please pass --foo <string>" 1
  echo $args[@] "$foo universe!!"
  echo "HOME=$HOME"

run [email protected]


$ powscript -c foo.pow -o foo.bash
$ ./foo.bash hello --foo powful
hello powful universe!

Check a json example here and here for more examples



Interactive mode (experimental)

Put this line in your .inputrc:

"\C-p" "powscript --interactive\n"

Then hitting ctrl-p in your console will enter powscript mode:

hit ctrl-c to exit powscript, type 'edit' to launch editor, and 'help' for help
> each(line)
>   echo line=$line
> run()
>   tail -2 ~/.kanban.csv | mappipe each
> run

POSIX /bin/sh compatibility

Powscript can produce 'kindof' POSIX /bin/sh-compatible output by removing bashisms, by introducing the --sh flag:

$ powscript --c foo.pow -o foo.bash
$ powscript --to sh --c foo.pow -o foo.sh

This however, is experimental, as well as the standalone bash2sh converter:

$ cat foo.bash | powscript --to sh  > foo.sh

NOTE: remove bashisms manually using docs/tools like bashism guide or checkbashisms The general rule for POSIX sh-output is: don't write bashfeatures in powscript

Debug your powscript syntax


OSX users

OSX might protest since it isn't quite GNU focused. Please run these commands after installing:

$ brew install bash
$ brew install coreutils gnu-sed grep gawk --default-names
$ echo 'export PATH=/usr/local/opt/coreutils/libexec/gnubin:$PATH' >> ~/.bashrc
$ sed -i 's|#!/bin/bash|#!/usr/local/bin/bash|g' powscript

Live expansion inside editor

HINT: use live expansion inside vim. Put the lines below in .vimrc and hit 'p>' in normal/visual mode to expand powscript to bash

vmap p> :!PIPE=2 powscript -c<CR>
nmap p> ggVG:!PIPE=2 powscript -c<CR>

Download Source Code

Download ZIP
Apr 18, 2022