「Bash」をカスタマイズして、Linuxをより便利に使いこなそう

2025年2月5日(水)
水野 源
第7回の今回は、Bashの仕組みを解説し、履歴管理やプロンプトをカスタマイズしてCLI環境を向上する方法を解説します。

はじめに

どのようなアプリにも、個人用の設定というものが存在します。例えば、Webブラウザはフォントやカラーテーマ、タブの細かい挙動などを個人の好みに応じてカスタマイズできます。Linuxで使われる様々なツールもこうした例に漏れず、非常に柔軟なカスタマイズや機能拡張が可能です。有名なテキストエディタであるVimやEmacsなどがその代表格で、そのカスタマイズの柔軟さと奥の深さは、想像を絶するものがあります*1

*1: Emacsは一見テキストエディタのように見えますが、その実体はEmacs Lisp言語の実行環境です。Emacs Lisp言語で実装可能なあらゆる機能をエディタ上で実行できるため、無限の拡張性を持っています。そしてLinuxを使いはじめたばかりのユーザーは、こうしたツールの「カスタマイズ沼」にはまり、休日を溶かすのが定番です。筆者は何度もやらかしています。

こうしたアプリは、自分用に細かくカスタマイズすることで、作業効率が大幅に上がることも決して珍しくありません。そこで今回は、LinuxのCLI操作のすべての起点となる、シェル(Bash)の便利なカスタマイズを紹介します。本記事を参考に、BashをカスタマイズしてLinux/WSLをより便利に使いこなしましょう。

Bashの設定ファイルと読み込み順

LinuxをはじめとするUnixライクなOSでは、基本的に設定はテキストファイルで管理します。Bashの設定もまた、テキストで記述されています。まずはBashの設定ファイルから見ていきましょう。

Bashの設定ファイルは大きく、システム全体で利用される共通の設定ファイルと、個人ごとの設定ファイルに分けられます。システム全体で利用される設定ファイルが「/etc/profile」です。対して、各ユーザーのホームディレクトリに作られる個人用な設定ファイルは「.bash_profile」「.bash_login」「.profile」「.bashrc」などに分けられています。それでは、カスタマイズの設定は具体的にどのファイルに書けば良いのでしょうか。

Bashはその起動のされ方によって「ログインシェル」と、それ以外の「対話的シェル」に分けられます。仮想コンソールやSSHでログインしたときに起動されるシェルがログインシェルです。そしてbashコマンドを実行するなどして起動された、それ以外のシェルが対話的シェルとなります。どのような違いがあるかと言えば、起動時に読み込まれる設定ファイルが異なります。

Bashはログインシェルとして起動されると、まず「/etc/profile」を読み込みます。その後にホームディレクトリから「.bash_profile」「.bash_login」「.profile」の順にファイルの存在を調べ、最初に見つかったもの「だけ」を読み込みます。そしてログインシェルでない対話的シェルとして起動した場合は、代わりにホームディレクトリの「.bashrc」を読み込みます。ここまでが標準的なBashの挙動です。

Ubuntuでは少し事情が異なります。まず、システムワイドな設定として「/etc/profile.d」というディレクトリが用意されています。そして「/etc/profile」の中で、このディレクトリ内にある拡張子が「.sh」のファイルをすべて追加で読み込むように設定されています。そのため、UbuntuにおけるシステムワイドなBashの設定は、適切な粒度で別ファイルに分割できるのです。これによってメンテナンス性も向上します。

続いて個人用の設定ファイルですが、Ubuntuでは各ユーザーのホームディレクトリに、デフォルトで「.profile」と「.bashrc」のみが作成されます。そして「.profile」の中で「.bashrc」を読み込むように設定されています。つまり、ログインシェルか対話的シェルであるかに関わらず「.bashrc」が必ず読み込まれるため、すべての設定はここに書くのがお勧めです。

なお「.bash_profile」や「.bash_login」といったファイルを「作ってはいけない」という点に注意してください。これらのファイルは「.profile」よりも優先順位が上のため、ファイルを作ってしまうとデフォルトの設定が読み込まれなくなってしまいます。

結論をまとめると、UbuntuにおけるBashの設定は以下のようになります。

  • 複数のユーザーが利用するようなサーバーで、全ユーザーに共通のカスタマイズを施したい場合は「/etc/profile.d」以下に設定ファイルを作成すれば良い
  • 個人用の設定はすべて「.bashrc」に書けば良い

Bashの設定ファイルの中身は、Bashがそのまま実行可能なシェルスクリプトそのものです。今回は具体的な設定内容の紹介に留め、シェルスクリプトの文法や理屈については解説しません。そのため、興味があれば、ぜひ専門の文献などを当たってみてください。

Bashをカスタマイズしよう

それでは、筆者が実際に行っているお勧めのカスタマイズを紹介していきます。

シェルオプションを使う

Bashには様々な「オプション」が用意されています。このオプションを設定するコマンドが「shopt」です。まずは実行してみましょう。

$ shopt

shoptコマンドを実行すると、シェルオプションの一覧が表示される

shoptコマンドを実行すると、シェルオプションの一覧と現在の有効/無効(on/off)が表示されました。

各シェルオプションを有効にするには「-s」オプション*2に続けてシェルオプション名を指定します。また、シェルオプションを無効にするには「-u」オプションとシェルオプション名を指定します。

*2: まぎらわしいですが、ここで言う「オプション」とは、コマンドラインに指定するオプションのことです。

見ての通り、非常に多くのシェルオプションが用意されていますが、その中でもお勧めなのが「autocd」です。これはcdコマンドを入力せずに、ディレクトリ名のみでカレントディレクトリを移動できるシェルの機能です。試しに有効化してみましょう。

$ shopt -s autocd

以下のように、ディレクトリ名のパス(ここでは/usr/bin)を入力するだけで、内部的にcdコマンドが実行されます。

$ pwd
/home/mizuno

$ /usr/bin
cd -- /usr/bin

$ pwd
/usr/bin

LinuxのCLIにおいて、ワーキングディレクトリを変更するcdコマンドは何度も繰り返し実行するコマンドです。これを省略できるのは、一見地味ですが慣れると手放せなくなる便利機能です。ぜひ試してみてください。

以下のコマンドを実行すると「.bashrc」の末尾に「shopt -s autocd」という1行を追記します。以後Bashを起動すれば、自動的にautocdが有効になります。

$ echo 'shopt -s autocd' >> ~/.bashrc

autocd以外のシェルオプションについてもマニュアルを参考に、色々と試してみると良いでしょう。

記録できる履歴の件数を増やす

筆者は、Bashの機能で最も便利なものは何かと言えば「履歴」だと考えています。Bashは過去に実行したコマンドの履歴を保存しており、簡単に呼び出すことができるのです。試してみましょう。まず、以下のようにlsコマンドを「-a」オプション付きで実行してください。

$ ls -a

通常通りコマンドが実行され、カレントディレクトリの内容が表示されます。再びプロンプトが表示されたら、カーソルキーの[↑]キーか[Ctr]キー+[P]キーを押してみましょう。直前に実行した「ls -a」がプロンプトの後に自動的に入力されます。つまり[↑]キーと[Enter]キーだけで、以前に実行したコマンドを再実行できるというわけです。

なお、履歴から呼び出したコマンドは、キーボードから入力を終えて[Enter]キーの押下を待っているのと同じ状態になっています。つまり、この状態で[←]キーや[→]キー、[BackSpace]キーを使って一部だけを編集可能です。例えば、履歴からコマンドを呼び出し、オプションや引数だけ書き換えて再利用することもできるのです。

$  ← プロンプトが表示されている状態で[↑]キーか[Ctrl]キー+[P]キーを押す
$ ls -a  ← 直前に実行したコマンドが入力された状態となる

さらに[↑]キーを続けて押すと、より古いコマンドを順番に呼び出すことができます。また[↓]キーか[Ctrl]キー+[N]キーを押すと、新しい方向に履歴を辿れます。うっかり[↑]キーを押しすぎてしまったら、[↓]キーを押して戻りましょう。ls程度のシンプルなコマンドであればそれほど恩恵はありませんが、複雑なコマンドの場合は毎回キーボードからコマンドを入力していると時間もかかりますし、タイプミスで実行に失敗してしまうこともあるでしょう。過去に一度でも実行したコマンドは、なるべく履歴を活用することを推奨します。

履歴はコマンドの実行効率を上げる資産であり、老舗のウナギ屋のタレのようなものです。Linuxを使い込めば使い込むほど、その大切さが身にしみてくるでしょう。実際に、筆者も新しいPCをセットアップしたら、まず最初にシェルの履歴ファイルをコピーして移植するほどです。Ubuntuのデフォルトの設定では直近から2,000件の履歴を「.bash_history」というファイルに保存しており、そのうち新しい方から1,000件をBashの起動時に読み込みます。しかし、筆者は1,000件では「まったく足りない」と考えているので、履歴の保存件数を増やすカスタマイズを推奨します。

実際にやってみましょう。Bashの履歴の件数は.bashrcの20行目付近で設定されています。以下の部分です。

HISTSIZE=1000
HISTFILESIZE=2000

「HISTFILESIZE」が「.bash_history」に保存される件数で、「HISTSIZE」がBashの起動時に読み込まれる件数です。ざっくりですが、どちらも「100,000」くらいにしておけば十分でしょう*3。テキストエディタで該当部分を書き換えてから、Bashを再起動してください。

*3: 筆者の業務PCの履歴ファイルをカウントしてみたら、本日時点で75,000件ほど記録されていました。

履歴の前方検索を有効にする

前述のカスタマイズで、履歴を10万件保存できるようになりましたが、10万回前に実行したコマンドを呼び出したい場合に[↑]キーを10万回押すのは非現実的です。そこで活用したいのが履歴の検索です。プロンプトが表示されている状態で[Ctrl]キー+[R]キーを押すと、プロンプトが「reverse-i-search」という表示に変わります。ここに検索したい文字列を入力すると、履歴の中からその文字列を含むコマンドを検索できるのです。

[Ctrl]キー+[R]キーを押した状態で「apt」と入力した例。「sudo apt update」コマンドがヒットした

履歴の検索はインクリメンタルサーチとなっているため、検索文字を長く入力するほど候補を絞り込めます。履歴の中に複数の候補がある場合は、文字の入力中に追加で[Ctrl]キー+[R]キーを押すと次の候補を呼び出せます。目的のコマンドが見つかったら、[Enter]キーを押せばコマンドを実行できる点は[↑]キーによる履歴の呼び出しと同様です。

[↑]キーに対する[↓]キーのように、履歴の検索でも[Ctrl]キー+[R]キーを押しすぎてしまった場合は[Ctrl]キー+[S]キーを押せば新しい履歴に戻って来られますが、Ubuntuのデフォルトの状態では、このキーは動作しません。正確に言うと、このキーを押すとターミナルの出力が停止して、操作できなくなってしまいます*4

*4: この状態になってしまったら、[Ctrl]キー+[Q]キーを押すことで出力を再開できます。

正直なところ、ターミナルの出力を停止したいというシーンはほとんどないでしょう。そこで、このキーバインドを解除して履歴の順方向検索を有効にしましょう。「.bashrc」の末尾に、以下の1行を追加してください。ファイルを書き換えたら、Bashを再起動しておきましょう。

stty stop undef

[Ctrl]キー+[R]キーを何度か押して、aptで履歴を検索している最中に[Ctrl]キー+[S]キーを押した状態。プロンプトの表示が「i-search」となり、順方向の検索が動作していることが分かる

履歴の検索を利用すれば、大昔に実行したコマンドや、名前の一部だけしか覚えていないコマンドでも簡単に探し出すことができます。直前に実行したコマンドを繰り返すときは[↑]キーが便利ですが、過去のコマンドを再実行したいときは検索を活用するのがお勧めです。

履歴のあいまい検索を可能にする

履歴は部分一致で検索されるため「ls -la」という履歴は「ls」「-la」「ls -l」のいずれで検索してもヒットしますが、「ls -a」ではヒットしません。このように、オプションの並び順が変わっただけでヒットしなくなるのは少し使いづらいでしょう。そこで、もう少し柔軟な検索が可能になるカスタマイズを紹介します。

まず、以下のコマンドで「fzf」パッケージをインストールしてください。これはあいまい検索フィルターであるfzfのパッケージをインストールします。

$ sudo apt install -U -y fzf

「.bashrc」の末尾に以下の1行を追記して、Bashを再起動してください。

source /usr/share/doc/fzf/examples/key-bindings.bash

再起動したBashで[Ctrl]キー+[R]キーを押すと、通常の履歴検索の代わりに「__fzf_history__」というシェル関数が呼び出されるようになっています。この関数は、Bashの履歴を表示する「history」コマンドの出力をフィルタである「fzf」コマンドに渡し、あいまいな検索を可能にしています。

__fzf_history__を有効にして[Ctrl]キー+[R]キーを押した状態。過去の履歴が一覧表示されている

通常の履歴の検索と同様に、検索文字列を入力してみましょう。候補が絞り込まれていきますが、その挙動が「あいまい検索」になっていることが分かるでしょう。

__fzf_history__に「ls -a」と入力した状態。「ls -a」コマンドそのものはもとより、オプションの並び順が異なる「ls -la」コマンドや、その文字を含む「lsb_release -a」コマンドもヒットしていることが分かる

履歴がある程度絞り込めたら、[↑]キーと[↓]キーで履歴を選択して[Enter]キーで実行できます。ヒットした複数の候補が一覧表示されるため、1行ずつしか表示できなかった通常の検索と比較して、飛躍的に視認性も向上しています。fzfを使った履歴のあいまい検索は、筆者にとっては手放せない定番のカスタマイズとなっています。

ターミナル間で履歴を共有する

LinuxのCLIを使いこなせるようになると複数のターミナルを起動して異なる作業を同時並行することもよくありますが、標準状態のBashではターミナル間で履歴を共有できません。例えば、ターミナルAであるコマンドを実行し、その直後にターミナルBで[↑]キーを押しても、ターミナルAの履歴は読み込めないのです。これでは非常に不便です。そこで、「.bashrc」の末尾に以下の設定を追記してください。

export PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

環境変数「PROMPT_COMMAND」には、シェルがプロンプトを表示する直前に実行するコマンドを定義できます。ここでは、以下の4つのコマンドを順次実行するように設定しています。

コマンド 挙動
history -n 履歴ファイルからまだ読み込んでいない履歴を読み込む
history -w 現在の履歴をファイルに書き込む
history -c 履歴をクリアする
history -r ファイルから履歴を読み込む

つまり、コマンドを実行する(次のプロンプトが表示される)たびに「別のシェルで更新されている可能性のある履歴をファイルから追加で読み込む」「現在の履歴の内容を履歴ファイルに書き込む」「現在の履歴をクリアしてファイルから読み込み直す」という処理を行っています。これをすべてのシェルで行うことにより、ターミナル間で半リアルタイムに履歴を同期できるというわけです。

注意点として、履歴ファイルを介した履歴の同期はプロンプトが表示される直前に行われるという点です。つまり、ターミナルAで実行した直前のコマンドをターミナルBからすぐに呼び出したい場合は、ターミナルBで一度[Enter]キーを押してプロンプトを再表示する必要があります。

プロンプトのカスタマイズ

UbuntuのBashのプロンプトには、デフォルトで「ユーザー名@ホスト名:カレントディレクトリ$」と表示されています。コマンドを実行する度に表示されるプロンプトは「現在のCLIの状態を確認する」という意味で非常に重要な情報源です。ここに様々な情報を追加するカスタマイズ、例えばプロジェクトのディレクトリ内では、現在のGitのブランチを表示したり、使用中のAWSのプロファイル名を表示したりなどは、シェルの定番のカスタマイズとなっています。

Bashのプロンプトは、環境変数「PS1」でコントロールできます。実際にやってみましょう。「.bashrc」の末尾に、以下を追記してください。gitコマンドを実行して現在のブランチを表示するシェル関数を定義し、その関数をプロンプト文字列の中に埋め込んでいます(Ubuntuのデフォルトのプロンプト設定の末尾に「$(_current_branch)」の部分を足しています)。

function _current_branch() {
    _git_branch=$(git branch --show-current 2>/dev/null) && echo "[$_git_branch] "
}

export PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] $(_current_branch)\$ '

カレントディレクトリをGitで管理されているディレクトリに変更すると、プロンプトの最後に現在のブランチが表示されるようになった

2段プロンプトのすすめ

プロンプトのカスタマイズは便利なので、とにかく色々な情報を表示したくなります。しかし、プロンプトが長くなると相対的にコマンドを入力するスペースが狭くなり、使い勝手が低下してしまいます。そこで筆者が強く推奨するのが「2段プロンプト」です。文字通り、プロンプトの中に改行を埋め込むことでプロンプトを2段にしてしまおうという発想です。先ほど「.bashrc」に記述したプロンプトの設定を、以下のように書き換えてください。

function _current_branch() {
    _git_branch=$(git branch --show-current 2>/dev/null) && echo "[$_git_branch] "
}

function _1st_line() {
    DATE="[$(date '+%Y-%m-%d %H:%M:%S')]"
    WIDTH=$(tput cols)
    
    printf "%$(( $WIDTH - ${#DATE} - 1 ))s" | tr ' ' '-'
    echo " $DATE"
}

export PS1='$(_1st_line)\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] $(_current_branch)\$ '

新しくプロンプトの1段目を表示するシェル関数を定義しています。具体的な処理としては、dateコマンドで現在時刻を、tputコマンドでターミナルの横幅を取得しています。そして、現在時刻の文字数をターミナルの幅から引き(実際にはスペースを入れるため、もう1文字分を引いています)、その数だけprintfコマンドでスペースを出力し、trコマンドでスペースをハイフンに置換したものを現在時刻と合わせて出力しています。この関数をプロンプト文字列の先頭に埋め込みました。関数の最後で時刻を表示しているechoコマンドが改行を出力するため、プロンプト内で改行されるというわけです。

2段プロンプトの例。1段目にセパレーターとして水平線と現在時刻を表示してみた。セパレーターによって視認性が向上するだけでなく、コマンドを実行した時刻がターミナル上に残るため記録としても便利だ

プロンプトには、様々な特殊文字を指定できます。マニュアルを参考に、自分だけの使いやすいプロンプトを作ってみてください。

おわりに

今回はBashの使い勝手をより向上させるため、履歴とプロンプトの見た目を改善するカスタマイズを紹介しました。これ以外にも、Bashには様々な機能が用意されています。ぜひマニュアルを読んだり、専門の文献に当たるなどして、自分なりの使いやすいCLI環境を構築してみましょう。またCLIの使い勝手をさらに向上させたいのであれば、Bashよりも高機能なシェルに乗り換えるというのも1つの手段でしょう。興味があれば検討してみてください。

今回はBashの設定ファイルを変更しましたが、こうした個人向けの設定ファイル群の管理にもノウハウがあります。次回は、Linuxにおける設定ファイルの上手な管理方法を紹介します。

日本仮想化技術株式会社
Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。日本仮想化技術株式会社所属。

連載バックナンバー

開発ツール技術解説
第7回

「Bash」をカスタマイズして、Linuxをより便利に使いこなそう

2025/2/5
第7回の今回は、Bashの仕組みを解説し、履歴管理やプロンプトをカスタマイズしてCLI環境を向上する方法を解説します。
開発ツール技術解説
第6回

Linuxの基礎コマンド群「Coreutils」を使いこなそう

2025/1/22
第6回の今回は、Linuxの基礎コマンド群「Coreutils」の概要を紹介し、ファイル操作、変換、ソート、プロセス管理など多彩なコマンドの使い方を解説します。
開発ツール技術解説
第5回

「WSLg」を使ってWindows上でLinuxのGUIアプリを動かしてみよう

2025/1/8
第5回の今回は、WSLに実装されている「Windows Subsystem for Linux GUI(WSLg)」という機能を使用して、Windowsのデスクトップ上でGUIアプリを動かす方法を解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています