Bash
BashはUnixシェルかつであり、GNUプロジェクトにおけるBourne Shellのフリーソフトウェアによる代替としてによって作成された。Bashは1989年に初めてリリースされ、ほとんどのLinuxディストリビューションやアップルのmacOSにおけるデフォルトのログインシェルとして広く普及している。Windows 10におけるWindows Subsystem for Linuxでも利用可能である。
Bashはコマンドプロセッサであり、通常はアクションを発生させるコマンドをユーザーがタイプするテキストウィンドウで起動する。Bashはスクリプトと呼ばれるファイルからコマンドを読み込んで実行することも可能である。Bashはそれ以外の全てのUnixシェルと同様に、ファイル名のグロブ（ワイルドカードによるマッチング）、パイプ、ヒアドキュメント、、変数、そして条件テストやのための制御構造をサポートする。Bashの予約語や構文などの言語の基本的要素は全て からコピーされており、ヒストリなど 以外の機能は や からコピーされている。 は 準拠のシェルであるが、数多くの拡張がされている。
バージョン1.03（1989年8月）以降のBashに存在するシェルショックと呼ばれるセキュリティホールが2014年9月に発見され、すぐにインターネットの至る所で広範囲なの原因となった。バグの特定後すぐに修正パッチが利用可能となったが、未だに全てのコンピュータが更新されているわけではない。
ブライアン・フォックスは1988年1月10日にBashのコーディングを開始したが、これは彼の前任開発者に進歩が見られなかったことにリチャード・ストールマンが不満を抱くようになってからのことである。ストールマンとフリーソフトウェア財団 (FSF) は、BSDやGNUのコードからビルドされた完全にフリーなシステムにとって既存のシェルスクリプトを実行できるフリーなシェルは戦略上非常に重要であると考えていたため、Bashは彼らが自ら創設した数少ないプロジェクトのうちの1つとなり、フォックスはFSFの従業員としてその作業を引き受けた。フォックスは1989年6月8日にBashのベータ版であるバージョン.99をリリースし、1992年中頃から彼がFSFから去る1994年中頃の間のある期間まで主要なメンテナであった。フォックスが去った後、彼の責務はもう一人の初期貢献者であるChet Rameyへと移された。
それ以降BashはLinuxユーザーの間で最も有名なシェルとなり、様々なLinuxディストリビューションやアップルのmacOSにおけるデフォルトインタラクティブシェルとなっている（ただしデフォルトのスクリプトシェルがである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が環境変数を通じてサブシェルに関数定義を渡す方法と関係していた。
のコマンド構文は、 のコマンド構文のスーパーセットである。構文の前処理において と異なって解釈される振る舞いに偶然遭遇してしまったり、新しく に組み込まれたコマンドと同じ名前のシステムコマンドを起動しようとする スクリプトを除いて、 は大量に存在する スクリプトのほとんどを修正せずに実行可能である。 のコマンド構文には、コマンドライン編集、、ディレクトリスタック、変数 codice_1や変数 codice_2、および の構文であるcodice_3など、 や から引用したアイデアが含まれる。
ユーザーがインタラクティブコマンドシェルでタブキーを押した場合、 は途中までタイプされたプログラム名やファイル名などの様々な名前をマッチさせるを自動で行う。 のコマンドライン補完システムは大変融通が利きカスタマイズ可能であるため、特定のプログラムやタスク用の引数やファイル名を補完する関数とまとめてパッケージングされることが多い。
codice_12 キーワードを使用する場合、 の関数宣言は・・ スクリプトと互換性がない（でも codice_12 を使用する場合に同様の問題が起こる）が、 は や の関数宣言構文を受け入れるため 準拠である。これ以外にも違いがあるため、互換性確保を配慮せず書かれた のシェルスクリプトを や のインタプリタで起動できることは滅多にないが、 が普及するにつれて互換性確保を配慮せずに書くことは少なくなっている。ただし モードにおいては、 はより密接に に準拠している。
ブレース展開はオルターネイションとも呼ばれ、 から取り入れた機能である。ブレース展開は取り得る組み合わせのセットを生成する。生成された結果はファイルとして存在する必要はない。展開された各文字列結果はソートされておらず、保存された順に左から右へと並んでいる:
ブレース展開がワイルドカードと組み合わされた場合、最初に括弧が展開されてから通常通りワイルドカードが置換される。したがって、カレントディレクトリにある拡張子が codice_15 または codice_16 または codice_17 のファイル群を獲得するには以下のようにする:
ブレース展開は取り得る全ての組み合わせだけではなく、連続した範囲に対して適用することも可能である。範囲は2つの整数や文字の間を、2つのドットで区切って指定する。 の新しいバージョンでは、範囲の終点を指定する2つ目の整数の後にさらに2つのドットと3つ目の整数を指定することで、範囲の増分を指定することも可能である。
ブレース展開を変数展開と組み合わせると、ブレース展開が先に行われ変数展開がその後に行われてしまうため、場合によってはcodice_18ビルドインが必要になる可能性もある:
Bashは起動の際、様々なのコマンドを実行する。 が使用する初期化ファイルは、実行権限が与えられてかつ codice_19 のようなシバンが記述されたBashのシェルスクリプトコマンドと似てはいるものの、実行権限とインタプリタディレクティブのどちらも必要ない。
の各要素は や からの派生である。このため、制限付きながら起動ファイルを と共用でき、さらに ユーザーには馴染みのあるいくつかの起動シーケンスを提供する。
以下の codice_20 コードは と互換性があり、codice_21 と codice_22 に対して と似たセマンティクスを提供する。codice_23は指定した ファイル名 のファイルが存在し読み込めるかどうかを調べるテストであり、存在しない場合 codice_24 の後の部分は評価（実行）されない（⇒ 短絡評価）。
や のバージョンの中には、codice_25 ディレクトリ配下に システム起動スクリプトが存在するものもある。 はこれらのスクリプトを、 の通常の初期化の一部として呼び出すが、それ以外の起動ファイルを 起動シーケンスの記述と異なる順序で読み込むこんでしまう可能性がある。さらにシステムが新しいユーザーアカウントに設定を提供するスケルトンファイルのように、ルート・ユーザーのファイル内におけるデフォルトの内容に問題がある可能性もある。ウィンドウマネージャの起動前にユーザーが 起動スクリプトで自身の環境変数を準備しようとすると、 の起動スクリプトにより予想外の問題が発生する可能性がある。これらの問題は、codice_26 を読み込むために codice_27 や codice_28 ファイルを使う場合に発生する可能性が高い。これらのファイルは や 端末などの、ウィンドウマネージャから生み出された シェルウインドウが必要とする環境変数を提供する。
codice_29オプションを付けてBashを呼び出したり、スクリプトにcodice_30を記述すると、BashはPOSIX 1003.2 standardに非常に良く準拠する。移植を前提としたBashシェルスクリプトは、最低でもBashをBourne Shellで置き換えた場合を考慮しなければならない。伝統的なBourne ShellにはないがBashには搭載されている機能は以下である:Bashはデフォルトの (Emacs) キーバインディングを利用して編集するためのコマンドライン用キーボードショートカットを提供するために、Readlineを利用する。codice_32を起動すればViバインディングが利用可能となる。
にはコマンドに対する実行モードとして、バッチモードと並行実行モードの2つがある。
バッチモードつまりコマンドを逐次的に実行するためには、コマンドを「codice_33」文字や別の行で分割する必要がある:
上記の例では、codice_34 が完了した後で codice_35 が実行される。
codice_34 と codice_35 を並行実行するには、以下の方法で実行する必要がある:
上記の例では、codice_34 がバックグラウンド（シンボル codice_39）で実行され、フォアグラウンドで codice_35 を実行するシェルへとすぐに制御が戻される。
プロセスはフォアグラウンド状態とバックグラウンド状態だけでなく、停止状態にすることも可能である。プロセスがフォアグラウンドで実行されていれば、これはをタイプすることで行える。バックグラウンドプロセスおよび停止されたプロセスの全てを一覧するにはcodice_41を起動することで行える:
上記の出力では、括弧内の数はジョブIDを示している。プラス記号は codice_42 や codice_43 に対応するデフォルトプロセスを指し示す。 および という表示は、を指し示す。最後の文字列はプロセスを開始したコマンドである。
プロセスの状態は様々なコマンドを使うことで変更できる。codice_43 コマンドはプロセスをフォアグラウンドにして、codice_42 は停止されたプロセスをバックグラウンドで実行するよう設定する。codice_42 と codice_43 は最初の引数に処理するプロセスを指定するジョブIDを渡すことができる。引数がない場合、codice_41 の出力でプラス記号が付いたデフォルトプロセスに対して処理が行われる。プロセスにシグナルを送って中断するためには、codice_49コマンドを使うことができる。ジョブIDはパーセント記号 「codice_50」の後に指定する必要がある:
Bashは先行するコマンドにより設定された終了コードに応じてコマンドを実行する、「条件付き実行」コマンド区切り文字を提供する。以下にその例を示す:
codice_51 は、codice_52 コマンドが「成功」した（終了ステータスとして codice_53 を返した）場合のみ実行され、codice_54 コマンドは codice_52 か codice_51 コマンドのどちらかがエラーを返した（終了ステータスが codice_53 以外を返した）場合のみ実行される。
全てのコマンドに対して、終了ステータスは特殊な変数である codice_58 に保存される。 は条件コマンド評価の形式として、 や もサポートする。
codice_59 と呼ばれる外部コマンドは のバグを報告する。このコマンドが呼び出されると、フォームが入力された状態でユーザーのデフォルトエディタが表示される。このフォームはBashのメンテナ（またはオプションでそれ以外のメールアドレス）にメールされる。