前書き:自動化に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それぞれの実装を比較しています。リンク先がない項目は、実装の比較例を作成次第、下表を更新していきます。

No.種類実装内容
1PATH取得カレントワーキングディレクトリの取得
2PATH取得実行ファイル名、実行ファイルの相対・絶対PATHの取得
3ファイル操作ファイルの存在確認
4ファイル操作新規ファイル作成(一時ファイル作成含む)、ファイル削除
5ファイル操作ファイル読み込み、ファイル書き込み
6ファイル操作PATHからのファイル名抽出、ファイル名(拡張子なし)取得、拡張子の取得
7ファイル操作ファイル一覧取得、ファイル数確認
8ファイル操作ファイルのコピー、ファイルの移動
9ファイル操作ファイルの圧縮・展開
10ディレクトリ操作ディレクトリの存在確認
11ディレクトリ操作新規ディレクトリ作成、ディレクトリ削除
12文字列操作文字列判定、正規表現による文字列加工
13文字列操作ヒアドキュメントの書き方
14文字列操作出力文字色の変更
15権限操作ユーザ名、UID、グループ名、GIDの取得
16権限操作root権限確認
17権限操作ファイルアクセス権の確認や変更
18外部コマンド操作外部コマンドの実行
19UIユーザ入力の取得
20UIオプション解析

各言語の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

https://debimate.jp/2020/01/13/review%ef%bc%9a%e3%83%97%e3%83%ad%e3%82%92%e7%9b%ae%e6%8c%87%e3%81%99%e4%ba%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%aeruby%e5%85%a5%e9%96%80-%e8%a8%80%e8%aa%9e%e4%bb%95%e6%a7%98%e3%81%8b%e3%82%89%e3%83%86/

https://debimate.jp/2020/01/16/review%ef%bc%9a%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e8%a8%ad%e8%a8%88%e5%ae%9f%e8%b7%b5%e3%82%ac%e3%82%a4%e3%83%89-ruby%e3%81%a7%e3%82%8f%e3%81%8b%e3%82%8b/

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

Python

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