Elixir スクリプトとしてもシェルスクリプトとしても実行可能なファイルを作る

  • 19
    Like
  • 0
    Comment
More than 1 year has passed since last update.

こうすればいい

sh.exs
#!/bin/sh

true || """
"
echo "ここにシェルスクリプトを書く"
exit
"""

IO.puts "ここに Elixir スクリプトを書く"

解説

シェルスクリプトとして解釈した場合

まずは

true || """
"

について。 """(改行)" は単なる2つの文字列である。空文字列と改行文字1つを含む文字列を並べて書いただけだ。シェルスクリプトでは隣接した文字列は結合されるため、 """(改行)" は改行文字1つを含む文字列に等しい。

||cmd1 || cmd2 のように使う演算子である。 cmd1 が0以外のステータスコードで終了したら cmd2 を実行するという意味になる。 true はステータスコード0を返すだけのコマンドなので、 true || """(改行)" の後半は実行されない。

続く行には自由にシェルスクリプトを書ける。ただし """ または #{ を含んではいけない。これらは Elixir スクリプトとして解釈したとき不都合がある。1

シェルスクリプトのパートは

exit
"""

で終わる。 exit はそこでシェルスクリプトの実行を終了する。 exit 以降の行はシェルスクリプトとして正しくないが、実行されないので問題はない。

Elixir スクリプトとして解釈した場合

true || """
"
echo "ここにシェルスクリプトを書く"
exit
"""

""" 〜 """ は heredoc (複数行文字列)である。 true || """ 〜 """true を返す無意味な式になる。

これ以降は自由に Elixir スクリプトを書ける。


  1. """ は Elixir として解釈したとき heredoc を閉じるクォートとして扱われる。 #{...} は Elixir の heredoc 中に Elixir コードを埋め込む記法であり、 Elixir として解釈したとき予期しないコードを実行することになる。