232 lines
6.1 KiB
Bash
Executable File
232 lines
6.1 KiB
Bash
Executable File
#!/bin/sh
|
||
set -e
|
||
|
||
if [ $# -eq 0 ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
|
||
cat <<USAGE >&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
|