Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較
前書き:自動化にBashを使うと後々辛い
本記事では、自動化で用いる言語をBash(Shell Script)からRubyやPython3に変更する方法を紹介します。Bash / Ruby / Python3のそれぞれで、ファイル操作やディレクトリ操作などをどのように書くか、コード例と実行例を示しながら紹介します(正確には、別記事で実装例を説明します)。
大前提として、Bashは良い言語であり、私はBashが好きです。主要なLinuxディストリビューションにインストールされていますし、POSIX互換を意識して書けば移植時の修正箇所が減ります。普段のターミナル操作と同じ感覚で書けるため、多くのLinux開発者は少ない学習時間でShell Scriptを書けます。
しかし、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スキルを伸ばす上ではオススメ。
ロシア人と国際結婚した地方エンジニア。
小学〜大学院、就職の全てが新潟。
大学の専攻は福祉工学だったのに、エンジニアとして就職。新卒入社した会社ではOS開発や半導体露光装置ソフトを開発。現在はサーバーサイドエンジニアとして修行中。HR/HM(メタル)とロシア妻が好き。サイトに関するお問い合わせやTwitterフォローは、お気軽にどうぞ。
16件のフィードバック
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較(… […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]
[…] Bash(Shell Script)からRubyやPythonに乗り換え!頻繁に使う処理を各言語で比較 […]