Elixir IExでもシェルコマンドを使いたい

[IEx]でもシェルコマンドを使えたらな〜と思うことはありませんか？

実は[IEx.Helpers]にシェルコマンド風の便利な関数がいくつか実装されています。

https://qiita.com/torifukukaiou/items/17d55cf896c24b13350e

## IEx Helpers

- [cd/1][IEx.Helpers.cd/1]
- [clear/0][IEx.Helpers.clear/0]
- [ls/1][IEx.Helpers.ls/1]
- [pwd/0][IEx.Helpers.pwd/0]

あくまで[Elixir]コードですので[IEx.Helpers.cd/1]のように引数を取る関数には[Elixir]の文字列を渡す必要があります。

```elixir:IEx
iex> ls "lib"
toukon        toukon.ex

iex> ls lib
warning: variable "lib" does not exist and is being expanded to "lib()", please use parentheses to remove the ambiguity or change the variable name
  iex:3

** (CompileError) iex:3: undefined function lib/0 (there is no such import)
    (elixir 1.14.0) src/elixir_expand.erl:618: :elixir_expand.expand_arg/3
    (elixir 1.14.0) src/elixir_expand.erl:634: :elixir_expand.mapfold/5
    (elixir 1.14.0) src/elixir_expand.erl:848: :elixir_expand.expand_remote/8
    (elixir 1.14.0) src/elixir.erl:364: :elixir.quoted_to_erl/3
    (elixir 1.14.0) src/elixir.erl:274: :elixir.eval_forms/3
    (elixir 1.14.0) lib/module/parallel_checker.ex:100: Module.ParallelChecker.verify/1
    (iex 1.14.0) lib/iex/evaluator.ex:329: IEx.Evaluator.eval_and_inspect/3
```

[Elixir]のIoT開発プラットフォームである[Nerves]向けに開発された[toolshed]パッケージを活用すれば更にもっとたくさんのシェルコマンド風の関数が使えます。

## Toolshed

- cat/1 
- date/0 
- hostname/0 
- ifconfig/0 
- top/0
- tree/1 

[toolshed]パッケージをインストールして、`use Toolshed`により関数をインポートします。

```elixir:IEx
iex> Mix.install([{:toolshed, "~> 0.2"}])

iex> use Toolshed
```

いくつか使ってみます。

```elixir:IEx
iex> date

iex> cat "mix.exs"

iex> tree "lib"
```

更に`cmd/1`を使えばどんな外部コマンドでも使えます。

```elixir:IEx
iex> cmd "git branch"
```

:tada:

## Systemモジュール

ElixirのSystemモジュールにも[System.cmd/3]と[System.shell/2]があり、それらを使えばどんな外部コマンドでも使えます。ただし、戻り値に癖があるので直接使うのには若干不便です。

https://qiita.com/mnishiguchi/items/e69ca51daef43e1661f4

## ご参考までに

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

https://qiita.com/piacerex/items/e0b6e46b1325bb931122

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

https://qiita.com/piacerex/items/e5590fa287d3c89eeebf

[Dashbit]: https://dashbit.co/
[Elixir]: https://elixir-lang.org/
[Erlang]: https://www.erlang.org/
[Phoenix]: https://www.phoenixframework.org/
[Nerves]: https://hexdocs.pm/nerves
[Livebook]: https://livebook.dev/
[IEx]: https://elixirschool.com/ja/lessons/basics/basics/#%E5%AF%BE%E8%A9%B1%E3%83%A2%E3%83%BC%E3%83%89
[Node | hexdocs]: https://hexdocs.pm/elixir/Node.html
[otp_distribution | elixirschool]: https://elixirschool.com/ja/lessons/advanced/otp_distribution
[Node.ping/1]: https://hexdocs.pm/elixir/Node.html#ping/1
[Node.connect/1]: https://hexdocs.pm/elixir/Node.html#connect/1
[Node.spawn/2]: https://hexdocs.pm/elixir/Node.html#spawn/2
[Node.list/0]: https://hexdocs.pm/elixir/Node.html#list/0
[Node.set_cookie/2]: https://hexdocs.pm/elixir/Node.html#set_cookie/2
[Node.get_cookie/0]: https://hexdocs.pm/elixir/Node.html#get_cookie/0
[epmd]: https://www.erlang.org/doc/man/epmd.html
[rpc]: https://www.erlang.org/doc/man/rpc.html
[erpc]: https://www.erlang.org/doc/man/erpc.html
[phoenix_live_dashboard]: https://github.com/phoenixframework/phoenix_live_dashboard
[phoenix_pubsub]: https://github.com/phoenixframework/phoenix_pubsub
[遠隔手続き呼出し]: https://ja.wikipedia.org/wiki/%E9%81%A0%E9%9A%94%E6%89%8B%E7%B6%9A%E3%81%8D%E5%91%BC%E5%87%BA%E3%81%97
[BEAM (Erlang virtual machine)]: https://en.wikipedia.org/wiki/BEAM_(Erlang_virtual_machine)
[:rpc.call/4]: https://www.erlang.org/doc/man/rpc.html#call-4
[IEx.Helpers.open/1]: https://hexdocs.pm/iex/IEx.Helpers.html#open/1
[Enum.reduce/3]: https://hexdocs.pm/elixir/Enum.html#reduce/3
[IEx.Helpers.h/1]: https://hexdocs.pm/iex/IEx.Helpers.html#h/1
[VS Code]: https://code.visualstudio.com/
[環境変数]: https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0
[Kernel]: https://hexdocs.pm/elixir/Kernel.html
[IEx.Helpers]: https://hexdocs.pm/iex/IEx.Helpers.html
[IEx.Helpers.cd/1]: https://hexdocs.pm/iex/IEx.Helpers.html#cd/1
[IEx.Helpers.ls/1]: https://hexdocs.pm/iex/IEx.Helpers.html#ls/1
[IEx.Helpers.pwd/0]: https://hexdocs.pm/iex/IEx.Helpers.html#pwd/0
[IEx.Helpers.clear/0]: https://hexdocs.pm/iex/IEx.Helpers.html#clear/0
[toolshed]: https://github.com/elixir-toolshed/toolshed
[System.cmd/3]: https://hexdocs.pm/elixir/System.html#cmd/3
[System.shell/2]: https://hexdocs.pm/elixir/System.html#shell/2