前書き:自動化にBashを使うと後々辛い

本記事では、自動化で用いる言語をBash(Shell Script)からRubyやPython3に変更する方法を紹介します。Bash / Ruby / Python3のそれぞれで、ファイル操作やディレクトリ操作などをどのように書くか、コード例と実行例を示しながら紹介します(正確には、別記事で実装例を説明します)。

大前提として、Bashは良い言語であり、私はBashが好きです。主要なLinuxディストリビューションにインストールされていますし、POSIX互換を意識して書けば移植時の修正箇所が減ります。普段のターミナル操作と同じ感覚で書けるため、多くのLinux開発者は少ない学習時間でShell Scriptを書けます。

しかし、Bashは言語としてサポートする機能が貧弱です。

Bashが機能的に貧弱な点

  • 変数が全てグローバル
  • コレクション(HashやList)がない
  • 例外処理が弱い(trapのみ)
  • オブジェクト指向ができない
  • 単体テスト(bats)するには、関数部と処理部を別ファイルに分離しなければならない

上記の機能面以外にも不満が出やすく、「シェル芸(難読化されたワンライナーを作成)する人が出てくる」、「特殊変数($?、$@、$#…)が覚えづらい」、「while(サブシェル)の計算結果が元プロセスでは0になる」など、Bash固有の問題があります。

このような点を踏まえずにBashで自動化スクリプトを作り始めると、未来に訪れる機能追加・異常系追加・コード改善で激しく後悔する事になります。そのため、本記事では、RubyやPython3によるScriptの置き換えを推奨しています。


自動化ScriptにBashを採用すべきかの判断基準

具体的なコード例に入る前に、私が自動化Scriptを書く際、Bashを採用すべきかの判断基準(主観、経験則)を以下にまとめます。以下のいずれかに当てはまる場合は、Bashを使用しても問題ないと考えています。

判断基準

  • RubyやPythonが環境になく、インストールもできない。
  • 自動化スクリプトは、あるコマンドをキックするだけ。
  • 作成予定のScriptが50〜100Step(ユーザ入力やファイル存在確認が3回程度)

判断基準に含めていないのは、プログラミング言語自体のアップデートという観点です。

後方互換性がない場合、アップデートに伴い、自動化Scriptが動作しなくなります。しかし、自動化Scriptという範囲では、枯れた技術であるBashを選んで助かった経験もなく、後方互換性がなくて困った経験もありません。自動化Scriptを少ない労力で長く運用したい場合は、プロジェクトの特性に合わせて言語選択してください。


Bash / Ruby / Python3の実装比較(一覧)

別記事で、Bash / Ruby / Python3それぞれの実装を比較しています。リンク先がない項目は、実装の比較例を作成次第、下表を更新していきます。

各言語のVersionは、以下を想定しています。

  • Bash:GNU bash, バージョン 5.0.3(1)-release
  • Ruby:ruby 2.5.5p157 (2019-03-15 revision 67260)
  • Python:Python 3.7.3

Bash / Ruby / Python3の参考書籍

各言語を知らない人向けに、参考書籍を紹介します。

Bash

“ゲームで極める〜“の方はややマニアックな知識を取り扱い、入門bashはいつものオライリー書籍。bashクックブックは、目次を見てピンときたら手に取ると良いかも。

個人的には、bashクックブックは入門bashよりオススメ。環境構築から始まり、実践的なTipsが多数紹介されているため、辞書的な使い方でお世話になります。

Ruby

感想:プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

感想:オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方

他言語からRubyを学ぶ場合は上記二冊を読んでから実践に入ると、体系的な知識が手に入る筈です。

Python

入門Python3で網羅的な内容を学べるので、“退屈なことは〜“の方は部分的に蛇足になる可能性があります。“エキスパートPython〜“は、簡単な自動化のレベルでは不要ですが、Pythonスキルを伸ばす上ではオススメ。