Skip to content

Instantly share code, notes, and snippets.

@ericnormand
Last active January 6, 2024 07:13
Show Gist options
  • Star 86 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save ericnormand/6bb4562c4bc578ef223182e3bb1e72c5 to your computer and use it in GitHub Desktop.
Save ericnormand/6bb4562c4bc578ef223182e3bb1e72c5 to your computer and use it in GitHub Desktop.
Boilerplate for running Clojure as a shebang script
#!/bin/sh
#_(
#_DEPS is same format as deps.edn. Multiline is okay.
DEPS='
{:deps {clj-time {:mvn/version "0.14.2"}}}
'
#_You can put other options here
OPTS='
-J-Xms256m -J-Xmx256m -J-client
'
exec clojure $OPTS -Sdeps "$DEPS" "$0" "$@"
)
(println "Hello!")
(require '[clj-time.core :as t])
(prn (str (t/now)))
(prn *command-line-args*)
(println (.. (Runtime/getRuntime)
totalMemory))
$ cp script.clj ~/bin/cljtest2
# ~/bin is on my $PATH
$ chmod +x ~/bin/cljtest2
$ time cljtest2 "Yo" "Hey" 1 3 4 - -ff
Hello!
"2019-03-01T17:22:43.564Z"
("Yo" "Hey" "1" "3" "4" "-" "-ff")
268435456
real 0m2.073s
user 0m6.073s
sys 0m0.297s
$
@yogsototh
Copy link

yogsototh commented Apr 24, 2023

I just figured out a way to make it even more portable by adding a step that install a specific version of Clojure local to the script.

#!/bin/sh
#_(

   #_DEPS is same format as deps.edn. Multiline is okay.
   DEPS='
   {:deps {
           clj-http/clj-http {:mvn/version "3.12.3"}
           cheshire/cheshire {:mvn/version "5.11.0"}
           }}
   '

   #_You can put other options here
   OPTS='
   -J-Xms4m -J-Xmx256m
   '

if [[ ! -x .local/bin/clojure ]]; then
  [[ ! -d .local ]] && mkdir .local
  pushd .local
  curl -O https://download.clojure.org/install/posix-install-1.11.1.1273.sh
  chmod +x posix-install-1.11.1.1273.sh
  ./posix-install-1.11.1.1273.sh -p $PWD
  popd
fi

exec .local/bin/clojure $OPTS -Sdeps "$DEPS" "$0" "$@"
)

(require 
  '[clj-http.client :as client]
  '[clojure.pprint :as pp])

(defn -main [& args]
  (pp/pprint (:body (client/get "https://www.example.com" {}))))

(apply -main *command-line-args*)

So with this small block added, your only dependency is java.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment