Bash
Bashセッションのスクリーンショット
作者ブライアン・フォックス
Bash(バッシュ)はUnixシェルかつコマンド言語(英語版)であり、GNUプロジェクトにおけるBourne Shellのフリーソフトウェアによる代替としてブライアン・フォックス(英語版)によって作成された[7][8]。Bashは1989年に初めてリリースされ[9]、ほとんどのLinuxディストリビューションのデフォルトのログインシェルとして広く普及している。Windows 10におけるWindows Subsystem for Linuxでも利用可能である[10]。
Bashはコマンドプロセッサであり、通常はアクションを発生させるコマンドをユーザーがタイプするテキストウィンドウで起動する。Bashはスクリプトと呼ばれるファイルからコマンドを読み込んで実行することも可能である。Bashはそれ以外の全てのUnixシェルと同様に、ファイル名のグロブ(ワイルドカードによるマッチング)、パイプ、ヒアドキュメント、コマンド置換(英語版)、変数、そして条件テストや反復(英語版)のための制御構造をサポートする。Bashの予約語や構文などの言語の基本的要素は全てBourne shellからコピーされており、ヒストリなどBourne shell以外の機能はC ShellやKornShellからコピーされている。BashはPOSIX準拠のシェルであるが、数多くの拡張がされている。
Bashという名前は .mw-parser-output ruby.large{font-size:250%}.mw-parser-output ruby.large>rt,.mw-parser-output ruby.large>rtc{font-size:.3em}.mw-parser-output ruby>rt,.mw-parser-output ruby>rtc{font-feature-settings:"ruby"1}.mw-parser-output ruby.yomigana>rt{font-feature-settings:"ruby"0}Bourne-again shell(ボーン・アゲイン・シェル) の頭字語であり、Bashの置換対象であるBourne Shell[11]と、現代アメリカのキリスト教において精神的な再生を意味する born again(ボーン・アゲイン)(新生)に引っ掛けた駄洒落である[12][13][14][15]。 ブライアン・フォックスは1988年1月10日にBashのコーディングを開始した[16]が、これは彼の前任開発者に進歩が見られなかったことにリチャード・ストールマンが不満を抱くようになってからのことである[7]。ストールマンとフリーソフトウェア財団 (FSF) は、BSDやGNUのコードからビルドされた完全にフリーなシステムにとって既存のシェルスクリプトを実行できるフリーなシェルは戦略上非常に重要であると考えていたため、Bashは彼らが自ら創設した数少ないプロジェクトのうちの1つとなり、フォックスはFSFの従業員としてその作業を引き受けた[7][17]。フォックスは1989年6月8日にBashのベータ版であるバージョン.99をリリースし[9]、1992年中頃[18]から彼がFSFから去る[19]1994年中頃[20]の間のある期間まで主要なメンテナであった。フォックスが去った後、彼の責務はもう一人の初期貢献者であるChet Rameyへと移された[21][22][23]。 それ以降BashはLinuxユーザーの間で最も有名なシェルとなり、様々なLinuxディストリビューションのデフォルトインタラクティブシェルとなっている[24][25][26](ただしデフォルトのスクリプトシェルがAlmquist ShellであるLinuxディストリビューションもある)。BashはMicrosoft Windowsにも移植されてCygwinやMinGWの一部として配布されており、DJGPP
歴史
2014年9月、UNIX/Linux・ネットワーク・テレコム専門家でありイギリスで働いているStephane Chazelas[27]は、プログラム内にセキュリティバグを発見した。このバグは最初9月24日に公開されてシェルショックと命名され、CVE-2014-6271[※ 1], CVE-2014-6277[※ 2]およびCVE-2014-7169[※ 3]のナンバーが割り当てられた。Bashを使用したCGIスクリプトで任意コード実行が可能となり攻撃されやすくなるため、シェルショックは深刻なバグとみなされた。シェルショックは、Bashが環境変数を通じてサブシェルに関数定義を渡す方法と関係していた[28]。 Bashのコマンド構文は、Bourne shellのコマンド構文のスーパーセットである。構文の前処理においてBashと異なって解釈される振る舞いに偶然遭遇してしまったり、新しくBashに組み込まれたコマンドと同じ名前のシステムコマンドを起動しようとするBourne shellスクリプトを除いて、Bashは大量に存在するBourne shellスクリプトのほとんどを修正せずに実行可能である。Bashのコマンド構文には、コマンドライン編集、コマンド履歴
機能
ユーザーがインタラクティブコマンドシェルでタブキーを押した場合、Bashは途中までタイプされたプログラム名やファイル名などの様々な名前をマッチさせるコマンドライン補完(英語版)を自動で行う。Bashのコマンドライン補完システムは大変融通が利きカスタマイズ可能であるため、特定のプログラムやタスク用の引数やファイル名を補完する関数とまとめてパッケージングされることが多い。
Bashの構文には、Bourne shellにはない拡張が多く存在する。Bashは他のプロセスを生成せずに整数演算ができる。この演算のためにBashは ((数式)) コマンドと $((数式)) 変数構文を利用する。Bashの構文は入出力リダイレクトを単純化する。例えば、Bashでは &> 演算子を使用することで、標準出力と標準エラー出力を同時にリダイレクトすることができ、Bourne shellにおいてこれに相当するコマンドである コマンド > file 2>&1 よりも簡単にタイプできる。Bashは<(コマンド)および>(コマンド)構文を使用することにより、プロセス置換(英語版)をサポートする。この構文は、通常のリダイレクトではファイル名が記述される箇所にあるコマンドの出力(または入力)を引数の代用とする(これは名前なしパイプをサポートするシステムならば /proc/fd/ の名前なしパイプにより実装され、名前付きパイプが必要ならば一時的な名前付きパイプにより実装されている)。
function キーワードを使用する場合、Bashの関数宣言はBourne・Korn・POSIXスクリプトと互換性がない(KornShellでも function を使用する場合に同様の問題が起こる)が、BashはBourne shellやKornShellの関数宣言構文を受け入れるためPOSIX準拠である。これ以外にも違いがあるため、互換性確保を配慮せず書かれたBashのシェルスクリプトをBourneやKornShellのインタプリタで起動できることは滅多にないが、Linuxが普及するにつれて互換性確保を配慮せずに書くことは少なくなっている。