近頃、シェルスクリプトをひとしきりディスった後に最近の進展も見ていますよ〜アピールの為だけに、 良くOilシェルスクリプトが言及されている気がする。 しかも言及するだけで明らかに試してないのにダメだって前提で結局シェルはダメなんですよ、と続ける事が多い。

試してから言えよっ!っていう気持ちで一杯なので、ちょっとOilシェルスクリプトの話をしたい。 本家の入門とかをちらっと見た後にわかって無い事言う人向けなので、本家の入門をちらっと見て思う事はあまり言及しません。

なお以上は自分が読んで勝手に解釈した結果なので、本家の人は違う見解を持っている可能性はあります。

Oilシェルスクリプトは、bsh+Expresisonモード

まずOilシェルスクリプトとは何か?という事を簡単に述べたい。 これは新しいシェル。 で、コンセプトとしては、

  1. 基本的にはbshとして振る舞う(コマンドモード)
  2. 一部プログラムっぽい事したい時はシェルとは違う普通の言語っぽく振る舞う(Expression Mode)

というもの。 1はbsh系列のシェルと互換らしく、少なくとも自分が普段書くようなbashのスクリプトはだいたいそのまま動く。 良く分からない拡張機能以外は動くと思って良い。

で、幾つかのケース、たとえば以下みたいなのがExpressionモードとなる

  1. イコールの右辺
  2. ifやforの後に括弧でくくられた範囲
  3. $[]でくくられた範囲

他にもあるけれど、まぁだいたい上くらい理解してけば良い。

これは以下の2つが凄い違うという事でもある。

# 括弧の中はExpressionモード
if (x > 0) {
  echo $x
}
# ifの条件はコマンドモードのまま
if test $x -gt 0 {
  echo $x
}

コマンドモードだと、以下みたいにファイル名とかをダブルクオート無しで書ける。

if test -d /hge {
  echo "/hogeはディレクトリです。"
}

コマンドモードはbsh系のシェルで、全てのシェルの面倒さもそのまま引き継いでいる代わりに簡潔に書けて新しい事を覚える必要はありません。

ExpressionモードはJavaScriptをベースにPythonやRubyから便利そうなのを拝借した感じの言語になっていて、これは新規言語です。 ただ、こちらもほとんど「たぶんこうだろう」と思って書けばだいたいはそのまま動きます。spliceとか一部慣れる必要があるけれど、その辺だけなら5分程度で習得出来ます。(ただし現状は良い入門が無いのでちょっと敷居は高い)

ブレースはなんなのよ?というのもあるけれど(ブロックです)、その辺はだいたい思った通りに動くので最初は気にしなくていいでしょう。

このExpressionモードとコマンドモードという事だけ理解して、本家のサンプルをちらっと見れば、今回自分がする議論は全て理解出来ると思います。(し、使い始めるにもほぼ十分な知識といえる気がする)

参考:Command vs. Expression Mode

Oilシェルは、シェルスクリプトをターゲットにしたシェル

Oilシェルというのは、シェルスクリプトをターゲットにしています。インタラクティブなシェルはターゲットにしていないという事になる。 ターゲットにしていないというのは、使えないという訳じゃありません。 あまりbashと比べて良い所が無いという意味で、けれど普通に使えます(これは重要なポイント、後述)。

シェルスクリプトというのは、基本的には小さいファイルで一つのコマンドとして書くシェルスクリプトをイメージしています。 ようするにファイルの先頭が

#!/usr/bin/env oil

で始まるものという事です。

これは凄く大きなポイントで、Oilに言及する時にここがわかってない奴は全く触った事無いな…って感じがする所でもあります。 以下、この事がどういう事を意味するのかの帰結について言及してみたいと思います。

利点:シェルスクリプトなので、大きなシステムの少しだけOilを採用、という事がしやすい(というか普通にそこから始まる)

インタラクティブなCLIのシェルを置き換えるのでは無く、シェルスクリプトを置き換える、というのは重要なポイントです。 日々の作業をするCLIを置き換えるのは乗り換えに大きなコストが発生します。 シェルスクリプトを置き換えるにはそれが無い。

シェルスクリプトで書くコマンドというのは、ようするに数行で終わるものなので短い。 普通これらをたくさん組み合わせて仕事をする事になると思います。

そのうちの小さい一つだけをoilに置き換える、という事が出来るので、導入がちょっとずつ出来る、というのがメリットです。 ちょっと使ってみて、うまく行かなければbashやzshに戻せば良い。 そして一番大きな所を念の為zshのままにしておく、ということが出来る。 全部oilにしないと困る事はほとんど無く、 むしろコマンドモードでの高い互換性が、sh側でコマンドモード的な事しかしない範囲なら全くoilを使っているのかshを使っているのかを意識しなくて良い、という事でもあります。 他のshのスクリプトと混ぜて混乱が無いように作られている、というのがoilの大きな長所の一つです。

だからshのシェルスクリプトで書かれているシステムの、下の方のシェルスクリプトで書かれたファイルだけ置き換える、 という事をちょっとずつ進めていけます。試して嫌だったらやめるのも簡単。 それほど複雑な事をしていない所ならbashに戻すのも簡単です。

普通にshベースのシェルスクリプトで雑用を片付けていって、 for文とか関数が使いたくなった所でだけoilにする。そこだけexpressionモードを使う感じに書く事でshをちょっと拡張した感じで使える。 それがoilシェルスクリプトの良い所です。

利点: (shを知っていれば)学習コストがめちゃくちゃ低い

Expressionモードは使う範囲ではほぼ数分で学習が終わると思います。Expressionモードの中では新しさはほとんど無いので、現代的なプログラミング言語をある程度知っていればほとんど既知の概念に結び付けられるはずです。 また、シェルスクリプトで使う範囲は凄く狭いので、必要な事だけなら5分程度で学習しきれると思います。

コマンドモードはいろいろあるけれど、bshと同じなのでbshをすでに知っていれば学習コストはゼロです。

なので、shを知っていればほとんど学習する必要は無く使い始める事が出来ます。

一番むずかしいのがコマンドモードとExpressionモードの違いなのだけれど、これはシェルで普段苦しんでいてどうして面倒なのかが良くわかっている人が見れば一瞬で理解出来ます。 逆に既存のシェルを知らないと不要に難しい。

今更新しいシェルとか覚えるのかったるい…という人向けのスクリプト用言語と言えます。

利点:シェルスクリプトの高い生産性を全て引き継いでいる

シェルスクリプトがなぜ高い生産性なのか、という事にはいろいろなポイントがあると思いますが、 それらは全て引き継いでいる、というのがPythonなどの汎用言語との大きな違いとなります。 汎用言語をシェルスクリプトの置き換えにする苦しさが無い。

特にコマンドモードがコマンドラインのシェルそのままに動くというのは大切です。 cdとかの記述が全てダブルクオートとか無しで出来て、 コマンドラインでいろいろ試してスクリプトファイルにコピペしたり、逆にスクリプトがおかしい時にそこの行だけコピペしてコマンドラインで試せる、というのは完全に再現出来ています。 これがOilシェルがシェルである理由と思います。

また、リダイレクトとかが全てシェルとして動くので、汎用言語の面倒さがありません。

コマンドが別々のプロセスになりスクリプトがどんどん小さなファイルに分かれていくあの開発時の感覚はそのままです。

シェルの快適さ、手軽さがそのまま残っている。これがOilの一番の良い所です。

欠点:シェルである

Oilはシェルです。コマンドモードはシェルを知らない汎用言語として思っている人には凄く変な所がたくさんあります。 シェルを知らないなら全部Expressionモードの言語の方が良く、 それならそもそもPythonでInvoke使ってる方が断然良いです。

シェルを知らない人、シェルを使いたくない人には向きません。

シェルの古い部分を全部消し去った、クリーンな何かでシェルを置き換えたい!という人向けのものではありません。 大部分がbsh互換というのは、大部分はbshのレガシーさを引き継いているという事でもあります。

ただ、Oilならシェルの変な所が出てきたらそこを明示的にExpressionモードにする事でほとんど回避する事が出来ます。 ですが、どこが変な所かを知っている為にはシェルを知っている必要があるので、 ご利益を引き出すにはシェルを知っている必要があります。

また、シェルスクリプトはシェルスクリプトなので、シェル的な問題点を幾つか含んでいます。 細かいファイルに分かれたシェルスクリプト群というのが望ましくない問題には向きません。

欠点:出来たてである

ドキュメントとか足りないのでちゃんと入門が書かれていれば一瞬で理解して使い始められるのだけれど、 本家のドキュメントからそうしたポイントを読み取るのはまぁまぁ大変です。特にOSHとOilとかの歴史的な混乱が面倒さを生んでいる…

ただそれなりにたくさんの記事が書かれているので、読めば分かりはします。

illegalな記法をいろいろ試していると落ちたりします。 安定性を求めている人は向かないでしょう。

ただ自分としては、見た目の印象よりはずっと使い物になる、 という思いの方が強かったです。 もう普通に自分の雑用に使っていくには十分なレベルだな、と思っています。 この辺はインタラクティブなシェルでは無くスクリプトの方を置き換えるという目の付け所の良さの結果でしょう。

まとめ:Oilは学習が容易で小さく導入する事が容易で、たまにちょっとだけ普通の言語になるシェルスクリプト用言語が欲しい人には良い

Oilはシェルスクリプトを知っている人なら、めちゃくちゃ覚えるのが簡単です。 しかも試す単位がシェルスクリプト1ファイルであってinteractiveな普段使いするシェルを置き換える訳では無いので、 導入の敷居は凄く低いです。

その代わりシェルスクリプトを置き換えるシェルスクリプトなので、そもそもシェルスクリプト使ってないんだけど…という人には使い道は無いと思います。 また、シェルスクリプトの落とし穴を減らすものであって、シェルスクリプトを減らすものではありません。 シェルスクリプトが好きで無いのなら、わざわざ使う物では無いでしょうね。