ITエンジニアによるITエンジニアのためのブログ

【Linux】Bash (Bourne-Again Shell)ガイド

エンジニアとしてBash(Bourne-Again Shell)を使いこなすことは、作業効率を劇的に向上させるだけでなく、堅牢な自動化スクリプトを作成するための第一歩です。

本ガイドでは、Bashの初心者~中級者に向けて、基本的な環境構築から、Bashの真骨頂である「展開」や「リダイレクト」の仕組み、そして高度なデータ操作・検索までを体系的に紹介します。

普段使っているだけでは気付かないようなBashの仕組みや機能を知ることができますので、ぜひ一読してご自身のスキルアップに役立ててみてください。

Bash(Bourne-Again Shell)とは

Bash(Bourne-Again Shell)は、ターミナルでのユーザー入力やスクリプトの読み込みにより、コマンドを実行するプログラムです。

このようなプログラムはシェルと呼ばれますが、Bashは最も人気が高いシェルの一つで、多くのLinuxディストリビューションで標準シェルとなっています。

Bashの環境設定とカスタマイズ

Bashを効率的に使うためには、まず自分が操作している環境を理解し、カスタマイズすることから始まります。

起動パターンと設定ファイルの違い

Bashには「ログインシェル」や「対話型シェル」といった起動パターンの違いがあり、それぞれ読み込まれる設定ファイル(.bashrc.profileなど)が異なります。これを理解することで、「設定したはずの環境変数が反映されない」といったトラブルを防ぐことができます。

シェル変数と環境変数の使い分け

「シェル変数」は現在のプロセスのみで有効ですが、「環境変数」は子プロセスにも引き継がれます。このスコープの違いを意識することは、安全なスクリプト作成に不可欠です。

シェルプロンプト表示のカスタマイズ

シェルプロンプトとは、ターミナルでコマンドの入力を待っているときに表示されるuser@hostname:~$ のような文字列のことです。

シェルプロンプトの表示内容は、好みの色に変更したり、コマンド出力結果を動的に表示したりなど、カスタマイズが可能です。

入力モードの切り替え(ViとEmacsモード)

Bashでコマンドを入力したり、コマンド履歴を確認する際はEmacs由来のキーバインディングがデフォルトですが、vi互換に切り替えることができます。

viモードのキーバインディングや設定の恒久化は、以下の記事で詳しく解説しています。vi/vim派の人はチェックしてみてください。

Bashのシェル展開(Expansion)をマスターする

Bashがコマンドを実行する際、入力した文字列がそのまま実行されるわけではありません。実行前に「展開(Expansion)」というプロセスを経て、文字列が書き換えられます。

例:ls *.txt と入力したとき、Bashは *.txt を実際のファイル名リストに置き換えてから ls コマンドに渡します。

Bashには主に8種類の展開があり、以下の強力な優先順位(実行順序)に従って処理されます。

  1. ブレース展開{a,b}のように記述し、複数の文字列を一瞬で生成します。ファイルの一括作成やバックアップに非常に便利です。
  2. チルダ展開~をホームディレクトリに置き換えるだけでなく、ディレクトリスタック(~+N)を活用した高速なパス参照も可能です。
  3. パラメータ展開(変数展開)${var}の形式で、外部コマンドを使わずに文字列の切り出しや置換をシェル内部で高速に行えます。
  4. コマンド置換$(command)で、あるコマンドの実行結果を別のコマンドの引数や変数に組み込めます。
  5. 算術展開$((...))を使い、外部プロセスを起動せずに整数演算を高速に処理します。
  6. プロセス置換:<(command)で、本来ファイル引数しか受け付けないコマンドに対しても、一時ファイルを作らずに別コマンドの結果を流し込めます。
  7. 単語分割:クォート(引用符)で囲まれていない展開結果は、IFS(区切り文字)に基づいて分割されます。意図しない分割を防ぐため、「迷ったらダブルクォート」が鉄則です。
  8. パス名展開(ワイルドカード)*?を使って、実際に存在するファイルをパターンマッチングで展開します。

まずは以下の記事で展開の全体像を把握してから、個々の展開を学ぶと理解しやすいです。

コマンド置換・パイプ・プロセス置換の簡易比較

展開の中でも混同しがちな3つの機能ですが、データの渡し方に以下のような違いがあります。

機能記述例主なユースケース
コマンド置換REF=$(date)コマンドの出力結果を変数や引数として再利用する
パイプcmd1 | cmd2コマンドの標準出力を、次のコマンドの標準入力へ直接渡す
プロセス置換diff <(cmd1) <(cmd2)コマンド出力を一時ファイル(ファイル引数)のように扱う

リダイレクトでデータの流れを制御する

通常、Bashは入力をキーボードから受け取り、コマンド結果を画面に出力しますが、リダイレクト(<, >)を使うと、コマンド入出力を自由自在にコントロールできるようになります。

コマンド入力をキーボードからファイルに切り替える例:

sort < list.txt

リダイレクトについては、こちらの記事で詳しく解説しています。

便利なBashコマンド

実務で役立つ便利なBashコマンドをいくつか紹介します。

pushdとpopdによる高速ディレクトリ移動

pushdpopdを使えば、ディレクトリ移動履歴をスタックとして積み上げ、複数のプロジェクト間をストレスなく行き来できます。

commコマンドによる高度なデータ比較

commコマンドは、ソート済みの2つのファイルを比較し、「片方だけに存在するデータ」や「共通して含まれるデータ」を高速に抽出する際に便利です。

comm [オプション] FILE1 FILE2

diffコマンドと似ていますが、diffはソースコードや文章の差分表示に便利なのに対し、commはデータセット(リストやCSV列など)の差分表示に便利です。

grepの正規表現によるパターン検索

grepはファイルやディレクトリから特定の文字列を検索する際に欠かせないコマンドです。ただの固定文字列による検索も便利ですが、grepの真価は正規表現を組み合わせたときに発揮されます。

拡張正規表現(ERE)を用いた検索例:

# apple(単数形)や apples(複数形)など、末尾が「e」または「es」で終わる行を検索
grep -E 'es?$' fruits.txt

まとめ:Bashの機能を組み合わせて業務を効率化しよう

これらの機能を組み合わせることで、Bashは単なるシェルから、あなたの業務を支える強力な武器へと進化します。各記事を参考に、ぜひ日々のターミナル操作をアップデートしてみてください。