LoginSignup
18
5

More than 1 year has passed since last update.

elixirの実行コマンドの実体を見る

Posted at

はじめに

この記事はElixirAdventCalendar2022の24日目の記事です。

elixirのコマンド

elixirをインストールすると、以下のコマンドが実行可能になります。

  • elixir
  • elixirc
  • iex
  • mix

これらのコマンドはelixirのソースコードbinディレクトリ配下に配置されています。
elixirのインストール時に、これらの実行コマンドのファイル(shellスクリプト)のシンボリックリンクが、インストール先に作成され、elixirのコマンドが実行可能になります。

elixirの実行コマンドの関係

elixirelixirciexmixはそれぞれ以下の様な相関関係があります。

コマンド 処理
elixirc +elixirオプションを付けてexec elixir
iex --no-halt --erl "-noshell -user Elixir.IEx CLI" +iexオプションを付けてexec elixir
mix Mix.start() Mix.CLI.main()を実行するelixirスクリプト

つまり、elixirciexmixelixirコマンドを内部的に呼び出しています。

elixirコマンド実行時に何が起こっているか

elixirコマンドの実体はerlコマンドです。
elixirは、コマンドに渡されるオプションや環境変数を、erlコマンドに渡すオプションに変換して、最終的にerlコマンドを実行します。

起動時のオプションの確認方法

elixir実行時に、ELIXIR_CLI_DRY_RUNの環境変数を指定することで、実行時の挙動を以下の様にexecからechoに変更して、起動時のオプションを確認することができます。

if [ -n "$ELIXIR_CLI_DRY_RUN" ]; then
  echo "$@"
else
  exec "$@"
fi

※ 詳細はelixir参照

コマンド実行時のオプション表示例

elixir --version

$ elixir --version
Erlang/OTP 25 [erts-13.1.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.13.3 (compiled with Erlang/OTP 22)
$ ELIXIR_CLI_DRY_RUN=1 elixir --version
erl 
-pa /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/eex/ebin 
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/elixir/ebin 
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/ex_unit/ebin 
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/iex/ebin 
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/logger/ebin 
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/mix/ebin 
-elixir ansi_enabled true 
-noshell 
-s elixir start_cli 
-extra --version

※ 見やすい様に改行を適宜入れています

iex --version

$ iex --version                                                                                      ✘ 1
Erlang/OTP 25 [erts-13.1.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

IEx 1.13.3 (compiled with Erlang/OTP 22)
~ ❯❯❯
$ ELIXIR_CLI_DRY_RUN=1 iex --version
erl 
-pa /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/eex/ebin
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/elixir/ebin
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/ex_unit/ebin
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/iex/ebin 
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/logger/ebin 
    /Users/ohara_tsunenori/.asdf/installs/elixir/1.13.3/bin/../lib/mix/ebin 
-elixir ansi_enabled true 
-noshell 
-user Elixir.IEx.CLI 
-extra --no-halt +iex --version
~ ❯❯❯

※ 見やすい様に改行を適宜入れています

erlコマンドの主要オプション

オプション 意味
-pa 後ろに続くディレクトリ配下のモジュールをerl実行にロード
-noshell erlangの対話シェルを起動せずにerlを実行
-s モジュールの関数を引数で実行

まとめ

elixirのコンパイラはerlangで実装されていることもあり、言語のコア部分はerlangと密接に関連しています。
オプション表示例から、elixirの実体はerlang(のerlコマンド)という事が見て取れます。

18
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
5