2019-08-09 12:51:42 +00:00
|
|
|
# babashka
|
|
|
|
|
|
|
|
|
|
[](https://circleci.com/gh/borkdude/babashka/tree/master)
|
|
|
|
|
[](https://clojars.org/borkdude/babashka)
|
|
|
|
|
[](https://cljdoc.org/d/borkdude/babashka/CURRENT)
|
|
|
|
|
|
2019-08-09 14:05:14 +00:00
|
|
|
A pure, fast and (severely!) limited version of Clojure in Clojure for shell scripting.
|
2019-08-09 12:51:42 +00:00
|
|
|
|
|
|
|
|
Properties:
|
|
|
|
|
|
|
|
|
|
- pure (no side effects)
|
2019-08-09 13:48:54 +00:00
|
|
|
- fast startup time
|
2019-08-09 12:51:42 +00:00
|
|
|
- interprets only one form
|
|
|
|
|
- reads from stdin and writes to stdout
|
|
|
|
|
|
|
|
|
|
## Status
|
|
|
|
|
|
2019-08-09 13:48:54 +00:00
|
|
|
Experimental. Not all Clojure core functions are supported yet, but can be
|
|
|
|
|
easily
|
|
|
|
|
[added](https://github.com/borkdude/babashka/blob/master/src/babashka/interpreter.clj#L10). PRs
|
|
|
|
|
welcome.
|
2019-08-09 12:51:42 +00:00
|
|
|
|
2019-08-09 14:02:08 +00:00
|
|
|
## Installation
|
|
|
|
|
|
|
|
|
|
Linux and macOS binaries are provided via brew.
|
|
|
|
|
|
|
|
|
|
Install:
|
|
|
|
|
|
|
|
|
|
brew install borkdude/brew/babashka
|
|
|
|
|
|
|
|
|
|
Upgrade:
|
|
|
|
|
|
|
|
|
|
brew upgrade babashka
|
|
|
|
|
|
|
|
|
|
You may also download a binary from [Github](https://github.com/borkdude/babashka/releases).
|
|
|
|
|
|
2019-08-09 13:48:54 +00:00
|
|
|
## Usage
|
2019-08-09 12:51:42 +00:00
|
|
|
|
2019-08-09 13:48:54 +00:00
|
|
|
The first argument to `bb` is the form to be executed. There is one special
|
2019-08-09 15:38:26 +00:00
|
|
|
variable, `*in*` which is EDN that is piped from stdin.
|
2019-08-09 12:51:42 +00:00
|
|
|
|
2019-08-09 13:48:54 +00:00
|
|
|
If the first argument is `--version`, then `bb` will print the version and exit.
|
2019-08-09 15:38:26 +00:00
|
|
|
If the first argument is `--raw`, then `bb` will interpret stdin as string input.
|
2019-08-09 12:51:42 +00:00
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
|
|
``` shellsession
|
2019-08-09 15:38:26 +00:00
|
|
|
$ ls | bb --raw '*in*'
|
|
|
|
|
["LICENSE" "README.md" "bb" "doc" "pom.xml" "project.clj" "reflection.json" "resources" "script" "src" "target" "test"]
|
|
|
|
|
|
2019-08-09 15:40:36 +00:00
|
|
|
$ ls | bb --raw '(count *in*)'
|
2019-08-09 15:38:26 +00:00
|
|
|
11
|
|
|
|
|
|
2019-08-09 12:51:42 +00:00
|
|
|
$ echo '[1 1 1 1 2]' | bb '(vec (dedupe *in*))'
|
|
|
|
|
[1 2]
|
|
|
|
|
|
|
|
|
|
$ echo '[1 1 1 1 2]' | bb '(inc (first *in*))'
|
|
|
|
|
2
|
|
|
|
|
|
|
|
|
|
$ echo '[{:foo 1} {:bar 2}]' | bb '(filter :foo *in*)'
|
|
|
|
|
({:foo 1})
|
|
|
|
|
|
|
|
|
|
$ echo '"babashka"' | bb '(re-find (re-pattern "b.b.*") *in*)'
|
|
|
|
|
"babashka"
|
|
|
|
|
```
|
|
|
|
|
|
2019-08-09 15:38:26 +00:00
|
|
|
Functions are written using the reader tag `#bb/fn`. Currently up to three
|
|
|
|
|
arguments are supported.
|
|
|
|
|
|
|
|
|
|
``` shellsession
|
|
|
|
|
$ echo '' | bb '(#bb/fn (+ %1 %2) 1 2)'
|
|
|
|
|
3
|
|
|
|
|
|
|
|
|
|
$ ls | bb --raw '*in*' | bb '(filterv #bb/fn (re-find (re-pattern "reflection") %) *in*)'
|
|
|
|
|
["reflection.json"]
|
|
|
|
|
```
|
|
|
|
|
|
2019-08-09 12:51:42 +00:00
|
|
|
## Test
|
|
|
|
|
|
|
|
|
|
Test the JVM version:
|
|
|
|
|
|
|
|
|
|
script/test
|
|
|
|
|
|
|
|
|
|
Test the native version:
|
|
|
|
|
|
|
|
|
|
BABASHKA_TEST_ENV=native script/test
|
|
|
|
|
|
|
|
|
|
## Build
|
|
|
|
|
|
|
|
|
|
You will need leiningen and GraalVM.
|
|
|
|
|
|
|
|
|
|
script/compile
|
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
|
|
Copyright © 2019 Michiel Borkent
|
|
|
|
|
|
|
|
|
|
Distributed under the EPL License, same as Clojure. See LICENSE.
|