Help us understand the problem. What is going on with this article?

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

More than 3 years have 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 として解釈したとき予期しないコードを実行することになる。 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away