こうすればいい
#!/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 スクリプトを書ける。
-
"""
は Elixir として解釈したとき heredoc を閉じるクォートとして扱われる。#{...}
は Elixir の heredoc 中に Elixir コードを埋め込む記法であり、 Elixir として解釈したとき予期しないコードを実行することになる。 ↩