ヽ(´・肉・`)ノログ

How do we fighting without fighting?

Elixir からシェルコマンドを実行する

System.cmd/1 で elixir 上からシェルコマンドが実行できる.

試してみよう.

$ iex
iex(1)> IO.puts System.cmd("ls")
LICENSE
README.md
ebin
lib
mix.exs
test

:ok

ところでコマンドの正常/異常終了を計測するのに exit status ( シェルスクリプトだと $? で取るアレ ) を取ることはできないのだろうか?

一応 (“ls; echo $?”) とすれば,最後にステータスコードを取れる

iex(1)> IO.puts System.cmd("ls; echo $?")
LICENSE
README.md
ebin
lib
mix.exs
test
0

:ok

とはいえ,もうちょっとまともな方法があるんじゃないだろうか. タプルの 1 番目に文字列,2 番目にステータスコードのようなものを想像している. 探してみよう.

elixir のソース を見たところ System.cmd/1 は erlang の :os をそのまま利用しているようだ. そこで erlang の :os のドキュメント Erlang – os を眺めてみる.……なさそうですなあ.

erlang のメーリングリストを検索してみると, os:cmd/1 with return code というスレッドに書いてあった, erlexec というライブラリを使えばできそうな気はする. (試してはいない)

Elixir から試したりいい方法がありそうだったらそのうち書くかもしれない.

このエントリーをはてなブックマークに追加