Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較

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

各言語の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スキルを伸ばす上ではオススメ。

                                                                                                

おすすめ

16件のフィードバック

  1. 2020年4月5日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較(… […]

  2. 2020年4月5日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  3. 2020年4月6日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  4. 2020年4月6日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  5. 2020年4月7日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  6. 2020年4月8日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  7. 2020年4月8日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  8. 2020年4月9日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  9. 2020年4月9日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  10. 2020年4月9日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  11. 2020年4月11日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  12. 2020年4月11日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  13. 2020年4月12日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  14. 2020年4月12日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  15. 2020年4月12日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]

  16. 2020年12月25日

    […] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]