Bash

Bash(バッシュ)はUnixシェルかつであり、GNUプロジェクトにおけるBourne Shellのフリーソフトウェアによる代替としてによって作成された。Bashは1989年に初めてリリースされ、ほとんどのLinuxディストリビューションのデフォルトのログインシェルとして広く普及している。Windows 10におけるWindows Subsystem for Linuxでも利用可能である。
Bashはコマンドプロセッサであり、通常はアクションを発生させるコマンドをユーザーがタイプするテキストウィンドウで起動する。Bashはスクリプトと呼ばれるファイルからコマンドを読み込んで実行することも可能である。Bashはそれ以外の全てのUnixシェルと同様に、ファイル名のグロブ(ワイルドカードによるマッチング)、パイプ、ヒアドキュメント、、変数、そして条件テストやのための制御構造をサポートする。Bashの予約語や構文などの言語の基本的要素は全てBourne shellからコピーされており、ヒストリなどBourne shell以外の機能はC ShellやKornShellからコピーされている。BashはPOSIX準拠のシェルであるが、数多くの拡張がされている。
Bashという名前は の頭字語であり、Bashの置換対象であるBourne Shellと、現代アメリカのキリスト教において精神的な再生を意味する (新生)に引っ掛けた駄洒落である。
歴史.
ブライアン・フォックスは1988年1月10日にBashのコーディングを開始したが、これは彼の前任開発者に進歩が見られなかったことにリチャード・ストールマンが不満を抱くようになってからのことである。ストールマンとフリーソフトウェア財団 (FSF) は、BSDやGNUのコードからビルドされた完全にフリーなシステムにとって既存のシェルスクリプトを実行できるフリーなシェルは戦略上非常に重要であると考えていたため、Bashは彼らが自ら創設した数少ないプロジェクトのうちの1つとなり、フォックスはFSFの従業員としてその作業を引き受けた。フォックスは1989年6月8日にBashのベータ版であるバージョン.99をリリースし、1992年中頃から彼がFSFから去る1994年中頃の間のある期間まで主要なメンテナであった。フォックスが去った後、彼の責務はもう一人の初期貢献者であるChet Rameyへと移された。
それ以降BashはLinuxユーザーの間で最も有名なシェルとなり、様々なLinuxディストリビューションのデフォルトインタラクティブシェルとなっている(ただしデフォルトのスクリプトシェルがAlmquist ShellであるLinuxディストリビューションもある)。BashはMicrosoft Windowsにも移植されてCygwinやMinGWの一部として配布されており、プロジェクトによりDOSにも移植され、NetWareにも移植され、さらに様々な端末エミュレータを通じてAndroidにも移植されている。
2014年9月、UNIX/Linux・ネットワーク・テレコム専門家でありイギリスで働いているStéphane Chazelasは、プログラム内にを発見した。このバグは最初9月24日に公開されてシェルショックと命名され、CVE-2014-6271, CVE-2014-6277およびCVE-2014-7169のナンバーが割り当てられた。Bashを使用したCGIスクリプトで任意コード実行が可能となり攻撃されやすくなるため、シェルショックは深刻なバグとみなされた。シェルショックは、Bashが環境変数を通じてサブシェルに関数定義を渡す方法と関係していた。
機能.
Bashのコマンド構文は、Bourne shellのコマンド構文のスーパーセットである。構文の前処理においてBashと異なって解釈される振る舞いに偶然遭遇してしまったり、新しくBashに組み込まれたコマンドと同じ名前のシステムコマンドを起動しようとするBourne shellスクリプトを除いて、Bashは大量に存在するBourne shellスクリプトのほとんどを修正せずに実行可能である。Bashのコマンド構文には、コマンドライン編集、、ディレクトリスタック、変数 codice_1や変数 codice_2、およびPOSIXの構文であるcodice_3など、KornShellやC shellから引用したアイデアが含まれる。
ユーザーがインタラクティブコマンドシェルでタブキーを押した場合、Bashは途中までタイプされたプログラム名やファイル名などの様々な名前をマッチさせるを自動で行う。Bashのコマンドライン補完システムは大変融通が利きカスタマイズ可能であるため、特定のプログラムやタスク用の引数やファイル名を補完する関数とまとめてパッケージングされることが多い。
Bashの構文には、Bourne shellにはない拡張が多く存在する。Bashは他のプロセスを生成せずに整数演算ができる。この演算のためにBashは codice_4 コマンドと codice_5 変数構文を利用する。Bashの構文は入出力リダイレクトを単純化する。例えば、Bashでは codice_6 演算子を使用することで、標準出力と標準エラー出力を同時にリダイレクトすることができ、Bourne shellにおいてこれに相当するコマンドである codice_7 よりも簡単にタイプできる。Bashはcodice_8およびcodice_9構文を使用することにより、をサポートする。この構文は、通常のリダイレクトではファイル名が記述される箇所にあるcodice_10の出力(または入力)を引数の代用とする(これは名前なしパイプをサポートするシステムならば codice_11 の名前なしパイプにより実装され、名前付きパイプが必要ならば一時的な名前付きパイプにより実装されている)。
codice_12 キーワードを使用する場合、Bashの関数宣言はBourne・Korn・POSIXスクリプトと互換性がない(KornShellでも codice_12 を使用する場合に同様の問題が起こる)が、BashはBourne shellやKornShellの関数宣言構文を受け入れるためPOSIX準拠である。これ以外にも違いがあるため、互換性確保を配慮せず書かれたBashのシェルスクリプトをBourneやKornShellのインタプリタで起動できることは滅多にないが、Linuxが普及するにつれて互換性確保を配慮せずに書くことは少なくなっている。ただしPOSIXモードにおいては、Bashはより密接にPOSIXに準拠している。
Bashはヒアドキュメントをサポートする。Bashはバージョン2.05bより、codice_14演算子を使った「ヒア文字列」から標準入力へのリダイレクトが可能である。
Bash3.0ではPerl言語を思い起こさせる構文を使用した、シェル組み込みの正規表現をサポートする。
Bash4.0では連想配列のサポートが導入された。
ブレース展開.
ブレース展開はオルターネイションとも呼ばれ、C shellから取り入れた機能である。ブレース展開は取り得る組み合わせのセットを生成する。生成された結果はファイルとして存在する必要はない。展開された各文字列結果はソートされておらず、保存された順に左から右へと並んでいる:
$ echo a{p,c,d,b}e
ape ace ade abe
ad ae af bd be bf cd ce cf
Bourne shellではBashと同じ出力を返さないため、ユーザーは移植するためのシェルスクリプトでブレース展開を使うべきではない。
$ # 伝統的なシェルはBashと同じ出力を返さない。
$ /bin/sh -c 'echo a{p,c,d,b}e'
a{p,c,d,b}e
ブレース展開がワイルドカードと組み合わされた場合、最初に括弧が展開されてから通常通りワイルドカードが置換される。したがって、カレントディレクトリにある拡張子が codice_15 または codice_16 または codice_17 のファイル群を獲得するには以下のようにする:
ls *.{jpg,jpeg,png} # *.jpg *.jpeg *.pngが展開されてから
 # ワイルドカード処理がなされる。
echo *.{png,jp{e,}g} # echoだけでもブレース展開が可能で、さらに括弧内の括弧も可能。
ブレース展開は取り得る全ての組み合わせだけではなく、連続した範囲に対して適用することも可能である。範囲は2つの整数や文字の間を、2つのドットで区切って指定する。Bashの新しいバージョンでは、範囲の終点を指定する2つ目の整数の後にさらに2つのドットと3つ目の整数を指定することで、範囲の増分を指定することも可能である。
1 2 3 4 5 6 7 8 9 10
$ echo file{1..4}.txt
file1.txt file2.txt file3.txt file4.txt
a b c d e
1 4 7 10
a d g j
ブレース展開を変数展開と組み合わせると、ブレース展開が先に行われ変数展開がその後に行われてしまうため、場合によってはcodice_18ビルトインが必要になる可能性もある:
$ start=1; end=10
$ echo {$start..$end} # Brace expansionが変数展開より先に評価されてしまうため展開に失敗。
$ eval echo {$start..$end} # 先に変数展開をして、その結果の文字列に対してのブレース展開を評価。
1 2 3 4 5 6 7 8 9 10
起動スクリプト.
Bashは起動の際、様々なのコマンドを実行する。Bashが使用する初期化ファイルは、実行権限が与えられてかつ codice_19 のようなシバンが記述されたBashのシェルスクリプトコマンドと似てはいるものの、実行権限とインタプリタディレクティブのどちらも必要ない。
Bourne shellやC shellの起動シーケンスとの比較.
Bashの各要素はBourne shellやC shellからの派生である。このため、制限付きながら起動ファイルをBourne shellと共用でき、さらにC shellユーザーには馴染みのあるいくつかの起動シーケンスを提供する。
レガシー互換なBash起動例.
以下の codice_20 コードはBourne shellと互換性があり、codice_21 と codice_22 に対してC shellと似たセマンティクスを提供する。codice_23は ファイル が存在し読み込める場合codice_24を、そうでない場合はcodice_25を返す。返り値が0の場合 codice_26 の後の部分が評価される。
[ -r ~/.profile ] && . ~/.profile # 環境設定で、かつてはBourne Shell限定の構文
if [ -n "$PS1" ] ; then # インタラクティブか?
 [ -r ~/.bashrc ] && . ~/.bashrc # インタラクティブシェル用のtty/プロンプト/関数設定
 [ -r ~/.bash_login ] && . ~/.bash_login # ログインシェル専用のログイン時タスク
fi # "if" ブロック終了
Bash起動におけるオペレーティングシステムの問題.
UNIXやLinuxのバージョンの中には、codice_27 ディレクトリ配下にBashシステム起動スクリプトが存在するものもある。Bashはこれらのスクリプトを、Bashの通常の初期化の一部として呼び出すが、それ以外の起動ファイルをBash起動シーケンスの記述と異なる順序で読み込むこんでしまう可能性がある。さらにシステムが新しいユーザーアカウントに設定を提供するスケルトンファイルのように、ルート・ユーザーのファイル内におけるデフォルトの内容に問題がある可能性もある。ウィンドウマネージャの起動前にユーザーがBash起動スクリプトで自身の環境変数を準備しようとすると、X Window Systemの起動スクリプトにより予想外の問題が発生する可能性がある。これらの問題は、codice_28 を読み込むために codice_29 や codice_30 ファイルを使う場合に発生する可能性が高い。これらのファイルはxtermや GNOME 端末などの、ウィンドウマネージャから生み出されたBashシェルウインドウが必要とする環境変数を提供する。
移植性.
codice_31オプションを付けてBashを呼び出したり、スクリプトにcodice_32を記述すると、BashはPOSIX 1003.2 standardに非常に良く準拠する。伝統的なBourne ShellにはないがBashには搭載されている機能は以下である:
 とは、Bash以外のUnixシェルでは適切に動作しないBashコードの部分を指す。
キーボードショートカット.
Bashはデフォルトの (Emacs) キーバインディングを利用して編集するためのコマンドライン用キーボードショートカットを提供するために、Readlineを利用する。codice_34を起動すればViバインディングが利用可能となる。
プロセス管理.
Bashにはコマンドに対する実行モードとして、バッチモードと並行実行モードの2つがある。
バッチモードつまりコマンドを逐次的に実行するためには、コマンドを「codice_35」文字や別の行で分割する必要がある:
コマンド1; コマンド2
上記の例では、codice_36 が完了した後で codice_37 が実行される。
codice_36 と codice_37 を並行実行するには、以下の方法で実行する必要がある:
コマンド1 & コマンド2
上記の例では、codice_36 がバックグラウンド(シンボル codice_41)で実行され、フォアグラウンドで codice_37 を実行するシェルへとすぐに制御が戻される。
プロセスはフォアグラウンド状態とバックグラウンド状態だけでなく、停止状態にすることも可能である。プロセスがフォアグラウンドで実行されていれば、これはをタイプすることで行える。バックグラウンドプロセスおよび停止されたプロセスの全てを一覧するにはcodice_43を起動することで行える:
$ jobs
[1]- Running コマンド1 &
[2]+ Stopped コマンド2
上記の出力では、括弧内の数はジョブIDを示している。プラス記号は codice_44 や codice_45 に対応するデフォルトプロセスを指し示す。RunningおよびStoppedという表示は、を指し示す。最後の文字列はプロセスを開始したコマンドである。
プロセスの状態は様々なコマンドを使うことで変更できる。codice_45 コマンドはプロセスをフォアグラウンドにして、codice_44 は停止されたプロセスをバックグラウンドで実行するよう設定する。codice_44 と codice_45 は最初の引数に処理するプロセスを指定するジョブIDを渡すことができる。引数がない場合、codice_43 の出力でプラス記号が付いたデフォルトプロセスに対して処理が行われる。プロセスにシグナルを送って中断するためには、codice_51コマンドを使うことができる。ジョブIDはパーセント記号 「codice_52」の後に指定する必要がある:
kill -s SIGKILL %1
条件付き実行.
Bashは先行するコマンドにより設定された終了コードに応じてコマンドを実行する、「条件付き実行」コマンド区切り文字を提供する。以下にその例を示す:
cd ディレクトリー・パス && ./何かのコマンド || echo "エラーが発生しました。" >&2
codice_53 は、codice_54 コマンドが「成功」した(終了ステータスとして codice_24 を返した)場合のみ実行され、codice_56 コマンドは codice_54 か codice_53 コマンドのどちらかがエラーを返した(終了ステータスが codice_24 以外を返した)場合のみ実行される。
全てのコマンドに対して、終了ステータスは特殊な変数である codice_60 に保存される。Bashは条件コマンド評価の形式として、 や もサポートする。
バグ報告.
codice_61 と呼ばれる外部コマンドはBashのバグを報告する。このコマンドが呼び出されると、フォームが入力された状態でユーザーのデフォルトエディタが表示される。このフォームはBashのメンテナ(またはオプションでそれ以外のメールアドレス)にメールされる。