#!/bin/sh set -e if [ $# -eq 0 ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then cat <&2 Usage: $(basename "$0") [options] [.exs file] [data] ## General options -e "COMMAND" Evaluates the given command (*) -h, --help Prints this message and exits -r "FILE" Requires the given files/patterns (*) -S SCRIPT   Finds and executes the given script in \$PATH -pr "FILE" Requires the given files/patterns in parallel (*) -pa "PATH" Prepends the given path to Erlang code path (*) -pz "PATH" Appends the given path to Erlang code path (*) -v, --version Prints Elixir version and exits --app APP Starts the given app and its dependencies (*) --erl "SWITCHES" Switches to be passed down to Erlang (*) --eval "COMMAND" Evaluates the given command, same as -e (*) --logger-otp-reports BOOL Enables or disables OTP reporting --logger-sasl-reports BOOL Enables or disables SASL reporting --no-halt Does not halt the Erlang VM after execution --werl Uses Erlang's Windows shell GUI (Windows only) Options given after the .exs file or -- are passed down to the executed code. Options can be passed to the Erlang runtime using \$ELIXIR_ERL_OPTIONS or --erl. ## Distribution options The following options are related to node distribution. --cookie COOKIE Sets a cookie for this distributed node --hidden Makes a hidden node --name NAME Makes and assigns a name to the distributed node --rpc-eval NODE "COMMAND" Evaluates the given command on the given remote node (*) --sname NAME Makes and assigns a short name to the distributed node ## Release options The following options are generally used under releases. --boot "FILE" Uses the given FILE.boot to start the system --boot-var VAR "VALUE" Makes \$VAR available as VALUE to FILE.boot (*) --erl-config "FILE" Loads configuration in FILE.config written in Erlang (*) --pipe-to "PIPEDIR" "LOGDIR" Starts the Erlang VM as a named PIPEDIR and LOGDIR --vm-args "FILE" Passes the contents in file as arguments to the VM --pipe-to starts Elixir detached from console (Unix-like only). It will attempt to create PIPEDIR and LOGDIR if they don't exist. See run_erl to learn more. To reattach, run: to_erl PIPEDIR. ** Options marked with (*) can be given more than once. USAGE exit 1 fi readlink_f () { cd "$(dirname "$1")" > /dev/null filename="$(basename "$1")" if [ -h "$filename" ]; then readlink_f "$(readlink "$filename")" else echo "$(pwd -P)/$filename" fi } # Stores static erlang arguments and --erl (which is passed as is) ERL="" # Stores erl arguments preserving spaces/quotes (mimics an array) erl () { eval "E${E}=\$1" E=$((E + 1)) } # Checks if a string starts with prefix. Usage: starts_with "$STRING" "$PREFIX" starts_with () { case $1 in "$2"*) true;; *) false;; esac } ERL_EXEC="erl" MODE="elixir" I=1 E=0 LENGTH=$# set -- "$@" -extra while [ $I -le $LENGTH ]; do S=1 case "$1" in +iex) set -- "$@" "$1" MODE="iex" ;; +elixirc) set -- "$@" "$1" MODE="elixirc" ;; -v|--no-halt) set -- "$@" "$1" ;; -e|-r|-pr|-pa|-pz|--app|--eval|--remsh|--dot-iex) S=2 set -- "$@" "$1" "$2" ;; --rpc-eval) S=3 set -- "$@" "$1" "$2" "$3" ;; --detached) echo "warning: the --detached option is deprecated" >&2 ERL="$ERL -detached" ;; --hidden) ERL="$ERL -hidden" ;; --logger-otp-reports) S=2 if [ "$2" = 'true' ] || [ "$2" = 'false' ]; then ERL="$ERL -logger handle_otp_reports $2" fi ;; --logger-sasl-reports) S=2 if [ "$2" = 'true' ] || [ "$2" = 'false' ]; then ERL="$ERL -logger handle_sasl_reports $2" fi ;; --erl) S=2 ERL="$ERL $2" ;; --cookie) S=2 erl "-setcookie" erl "$2" ;; --sname|--name) S=2 erl "$(echo "$1" | cut -c 2-)" erl "$2" ;; --erl-config) S=2 erl "-config" erl "$2" ;; --vm-args) S=2 erl "-args_file" erl "$2" ;; --boot) S=2 erl "-boot" erl "$2" ;; --boot-var) S=3 erl "-boot_var" erl "$2" erl "$3" ;; --pipe-to) S=3 RUN_ERL_PIPE="$2" RUN_ERL_LOG="$3" if [ "$(starts_with "$RUN_ERL_PIPE" "-")" ]; then echo "--pipe-to : PIPEDIR cannot be a switch" >&2 && exit 1 elif [ "$(starts_with "$RUN_ERL_LOG" "-")" ]; then echo "--pipe-to : LOGDIR cannot be a switch" >&2 && exit 1 fi ;; --werl) if [ "$OS" = "Windows_NT" ]; then ERL_EXEC="werl"; fi ;; *) while [ $I -le $LENGTH ]; do I=$((I + 1)) set -- "$@" "$1" shift done break ;; esac I=$((I + S)) shift $S done I=$((E - 1)) while [ $I -ge 0 ]; do eval "VAL=\$E$I" set -- "$VAL" "$@" I=$((I - 1)) done SELF=$(readlink_f "$0") SCRIPT_PATH=$(dirname "$SELF") if [ "$OSTYPE" = "cygwin" ]; then SCRIPT_PATH=$(cygpath -m "$SCRIPT_PATH"); fi if [ "$MODE" != "iex" ]; then ERL="-noshell -s elixir start_cli $ERL"; fi if [ "$OS" != "Windows_NT" ]; then if test -t 1 -a -t 2; then ERL="-elixir ansi_enabled true $ERL"; fi fi ERTS_BIN= set -- "$ERTS_BIN$ERL_EXEC" -pa "$SCRIPT_PATH"/../lib/*/ebin $ELIXIR_ERL_OPTIONS $ERL "$@" if [ -n "$RUN_ERL_PIPE" ]; then ESCAPED="" for PART in "$@"; do ESCAPED="$ESCAPED $(echo "$PART" | sed 's/[^a-zA-Z0-9_\-\/]/\\&/g')" done mkdir -p "$RUN_ERL_PIPE" mkdir -p "$RUN_ERL_LOG" ERL_EXEC="run_erl" set -- "$ERTS_BIN$ERL_EXEC" -daemon "$RUN_ERL_PIPE/" "$RUN_ERL_LOG/" "$ESCAPED" fi if [ -n "$ELIXIR_CLI_DRY_RUN" ]; then echo "$@" else exec "$@" fi