Bashとは何か? Bourne Again Shellを解説する
Bashは広く使われるUnix shellおよびスクリプト言語であり、ほとんどのLinuxシステムとほとんどのCIランナーでのデフォルトのコマンドインタプリタです。
Bashは「Bourne Again SHell」の略で、CIパイプラインのほとんどのstepを含め、世界の大多数のshell scriptを実行するプログラムです。古いBourne shellと互換性がありますが、配列、より良い文字列処理、多くの利便性を追加しています。あまりに一般的なため、「shell script」と「Bash script」はしばしば互換的に使われます。
Bashの由来
Bashは、Unixの元のBourne shell (sh) のフリーな代替として書かれました。後方互換性を保ちながら機能を追加し、ほとんどのLinuxディストリビューションでデフォルトのログインshellになりました。
Bash対sh
素のshは最小限のPOSIX shellであり、Bashは配列、[[ ]]テスト、プロセス置換などの追加機能を持つスーパーセットです。Bash固有の機能を使うscriptはshで実行すると壊れ、これは「ローカルでは動くがCIで失敗する」バグのよくある原因です。
Bashが追加するもの
- 構造化データのための配列と連想配列。
- パターンマッチング付きの
[[ ]]テスト構文。 file.{js,css}のようなbrace展開。- より安全なパイプラインのための
set -o pipefailオプション。
スクリプト言語としてのBash
Bashはプロンプト以上のものです。変数、ループ、関数、条件分岐を持ちます。CIパイプラインは、buildツールをつなぎ、テストを実行し、出力を整形するためにこれに大きく依存するので、少しのBash習熟が大きく役立ちます。
なぜCIでBashが重要か
ほとんどのworkflowのrun: stepは、Linux上でデフォルトでBashを通じて実行されます。BashのCI scriptを最初のエラーで大きく失敗させる信頼できる方法は、set -euo pipefailで始めることです。これは静かな失敗を停止したjobに変えます。
管理型ランナーでのBash
Latchkeyのランナーは標準のBashを搭載しているので、同じscriptが毎回同一に実行されます。厳格さは依然として制御できます。stepの先頭にset -euo pipefailを追加することが、信頼できるパイプラインのための最もレバレッジの高い習慣です。
重要なポイント
- BashはほとんどのLinuxシステムとCIランナーでのデフォルトのshellです。
- POSIX shのスーパーセットなので、Bash固有の機能は素のshでは壊れることがあります。
- scriptを
set -euo pipefailで始めると、BashはCIで素早く大きく失敗します。