LinuxのBashプロンプトは、主にPS1というシェル変数でカスタマイズできます。ユーザー名、ホスト名、現在のディレクトリ、時刻、権限の違いを適切に表示すれば、接続先や作業場所の取り違えを減らせます。一方で、色指定の囲み方や展開タイミングを誤ると、カーソル位置のずれ、毎回の遅延、意図しないコマンド実行を招きます。安全に試し、戻せる順序で設定しましょう。
現在のプロンプトを確認して一時変更する
最初に現在値を保存し、同じシェルの中だけで一時変更します。printf %qはBashが再利用できる形に近い引用表現で値を確認でき、見えない制御文字をそのまま端末へ出しにくい方法です。設定ファイルへ書く前に、作業用の新しい端末で表示、折り返し、履歴検索、長いコマンドの編集を確認します。
printf '%q\n' "$PS1"
saved_ps1=$PS1
PS1='\u@\h:\w\$ '
# 元に戻す場合
PS1=$saved_ps1
\uはユーザー名、\hは最初のドットまでのホスト名、\wは現在ディレクトリ、\$は実効UIDが0なら#、それ以外なら$を表示します。権限表示を文字として固定せず\$を使うと、一般ユーザーと管理者シェルの違いを視認できます。ただし表示は注意喚起であり、権限制御そのものではありません。
よく使うBashのプロンプトエスケープ
\u: 現在のユーザー名\h: 短いホスト名、\H: 完全なホスト名\w: ホームを~に省略した現在ディレクトリ、\W: 末尾要素\t: 24時間表記の時刻、\A: 時・分\!: 履歴番号、\#: 現在セッションのコマンド番号\n: 改行、\\: バックスラッシュ、\$: 権限に応じた記号\[と\]: 画面幅を消費しない制御シーケンスの範囲
長いパスでプロンプトが圧迫される場合は\Wを使うか、PROMPT_DIRTRIMへ残す末尾ディレクトリ数を設定します。フルパスを隠すと作業場所を誤る可能性もあるため、本番環境ではホスト名や環境名を残し、短さだけを優先しない方が安全です。二行プロンプトにすると情報量と入力幅を両立できます。
PROMPT_DIRTRIM=3
PS1='[\u@\h \w]\n\$ '
色付きプロンプトでは非表示文字を囲む
ANSI端末の色制御シーケンスは画面上の文字幅を消費しません。Bash Readlineへそのことを伝えるため、PS1内の非表示部分を\[と\]で囲みます。囲まないと、長い入力の折り返し、左右移動、履歴呼び出しで表示位置がずれることがあります。色を開始したら、最後に属性をリセットして後続出力へ色が漏れないようにします。
PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\$ '
この例はユーザーとホストを緑、パスを青にします。色番号やエスケープシーケンスの対応は端末によって差があり、すべての端末で同じ外観になるとは限りません。色だけで本番・検証環境を区別すると、モノクロ端末、コピーしたログ、色覚特性の違いで情報が失われます。文字ラベルやホスト名も併用します。
単一引用符と展開タイミングを理解する
PS1を設定するとき、単一引用符はその場でのパラメーター展開やコマンド置換を抑えます。たとえばPS1="$PWD $ "のように二重引用符で代入すると、代入した瞬間のディレクトリが固定表示されます。PS1="\w\$ "ではなく、Bashのプロンプトエスケープを単一引用符内へ記述すると、プロンプト表示時の現在値を使えます。
Bashはプロンプトエスケープを解釈した後、promptvarsオプションが有効ならパラメーター展開、コマンド置換、算術展開なども行います。PS1へコマンド置換を埋め込むと、プロンプトを出すたびに実行されます。外部入力、リポジトリ名、制御文字を無検証で組み込むと、遅延や表示の偽装、意図しない副作用につながるため、静的なエスケープを基本にします。
PROMPT_COMMANDは小さく副作用なく保つ
PROMPT_COMMANDが設定されていると、Bashは主プロンプトPS1を表示する前にその内容をコマンドとして実行します。新しいBashでは配列として各要素を順に実行できますが、古い環境や既存設定との互換性を確認する必要があります。重いネットワーク問い合わせ、対話入力、ディレクトリ変更、画面消去などを入れると、すべてのコマンド後の操作性に影響します。
declare -p PROMPT_COMMAND 2>/dev/null || true
prompt_set_status () {
last_status=$?
}
PROMPT_COMMAND=(prompt_set_status)
例は仕組みを示す最小形ですが、既存のPROMPT_COMMANDを上書きすると、ディストリビューション、端末統合、履歴同期、開発ツールの処理を失う可能性があります。実運用では現在の型と内容を確認し、既存要素を保持したうえで追加します。また、関数内の最初の$?だけが直前コマンドの状態なので、別のコマンドより先に保存します。
PS2、PS0、PS4の役割
PS1は通常の入力待ち、PS2は引用符や複合コマンドが未完のときの継続入力、PS0は対話シェルがコマンドを読み終えて実行する前、PS4はset -xによる実行トレースの接頭辞です。継続プロンプトを明確にすると、閉じ忘れた引用符の中へ意図せず次の行を入力する事故を見つけやすくなります。
PS2='continue> '
PS4='+ ${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
PS4に秘密値やコマンド全体を追加すると、デバッグログへ資格情報が流出する恐れがあります。set -x自体も展開後の引数を記録するため、本番や機密処理では安易に有効化しません。また、PS0やPS4の細かな動作はBash固有です。POSIX sh、dash、zsh、fishでは設定方法や対応エスケープが異なります。
.bashrcへ保存する前に起動条件を確認する
対話的な非ログインBashは通常~/.bashrcを読みます。ログインシェルは~/.bash_profileなどを読み、そこから~/.bashrcを読み込む構成がよく使われますが、配布版や組織設定で違います。SSH、端末アプリ、コンテナ、sudo後のシェルがどの起動形態かを確認し、無関係な非対話処理へプロンプト設定を適用しないようにします。
設定を永続化する場合は、既存ファイルを保全し、小さな変更単位で構文検査を行い、新しい端末で確認してから現在の端末を閉じます。現在のシェルへsource ~/.bashrcすると即座にすべての副作用が反映されるため、まず隔離した対話Bashで試す方が復旧しやすくなります。
bash -n ~/.bashrc
bash --noprofile --norc -i
安全で実用的な構成例
実務用プロンプトは、利用者、ホスト、短縮した作業パス、権限記号という静的情報から始めます。環境ラベルを付けるなら、利用者が変更できる外部文字列をそのまま端末制御へ渡さず、管理した固定値を使います。Git状態やクラウド認証状態を追加する場合も、公式の補助関数、タイムアウト、出力の無害化、巨大リポジトリでの性能を検証します。
PROMPT_DIRTRIM=3
PS1='[WORK \u@\h \w]\n\$ '
プロンプトは便利な表示ですが、接続先確認、権限確認、変更承認を置き換えるものではありません。重要操作の前にはhostname、id、pwdなどで実値を確認します。コピーしたコマンドの先頭へ偽プロンプトが含まれる場合もあるため、複数行を貼り付ける前に内容を読み、端末のブラケットペースト機能なども活用します。
問題が起きたときの戻し方
- 現在シェルでは保存しておいた
saved_ps1からPS1を戻す。 - 色が戻らない場合は新しい端末を開き、設定を読み込まないBashで確認する。
bash -nで起動ファイルの構文エラーを調べる。- PS1だけでなく
PROMPT_COMMAND、PS2、PS4、端末統合設定も確認する。 - 表示ずれは非表示シーケンスが
\[と\]で囲まれているか確認する。 - 遅延はコマンド置換や外部コマンドを外し、静的な最小PS1へ戻して切り分ける。
確認チェックリスト
- 変更前のPS1とPROMPT_COMMANDを確認・保全した
- 非表示の色制御を
\[と\]で囲んだ - PS1へ未検証の外部文字列や重いコマンド置換を入れていない
- 色以外にもホスト名や環境ラベルを表示した
- 起動ファイルの対象が対話Bashであることを確認した
- 新しい端末と長い入力行で表示・復旧を検証した
Bashプロンプトの改善は、装飾よりも作業コンテキストを正しく伝えることが目的です。まず静的なPS1を一時適用し、エスケープと引用を正しく使い、永続化前に別セッションで検証します。プロンプト表示のたびに動く処理を最小限に保つことで、安全性と応答性を両立できます。

コメント