サーバ内で作業する際のミスを防ぐ最良の手段は「サーバ内で作業しない(自動化する)こと」だが、どうしてもサーバ内で作業しなければいけないことはある。
複数のサーバで作業していたりすると、いまどのサーバにいてどういう状態なのかがわかりにくくなってしまう。そういうときにやっておくとミスを防げるかもしれない Bash プロンプトの設定について。
概要
こういうの感じのプロンプトになる。
- ホスト名が表示される
- カレントディレクトリが表示される
- Git リポジトリ内の場合
- ブランチ名が表示される
- コミットされていない変更や追加されていないファイルがあるかどうかを表示する
- root ユーザかどうかを表示する
- root (uid=0) であれば
#
- それ以外は
$
- root (uid=0) であれば
- 直前のコマンドでエラーがあったかどうかを色で表示する
- 終了ステータスが 0 なら緑
- それ以外は赤
ホスト名を変える
プロンプトを変える前にまずはこれ。
Amazon EC2 とかだと初期状態は IP アドレスから自動生成されたホスト名になっていてわかりづらい。わかりやすいホスト名を付けておくことで「違うサーバで作業してた」というような間違いを防げる。
Ubuntu
xxxxx.com
Amazon Linux 1
HOSTNAME=xxxxx.com
Amazon Linux 2
# hostnamectl set-hostname xxxxx.com
git-prompt.sh を落としてくる
プロンプトに Git リポジトリに関する情報を表示するための Git 公式便利ツールを入れる。
$ curl -L https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -o ~/.git-prompt.sh
bashrc に追記する
GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWCOLORHINTS=1
source ~/.git-prompt.sh
PS1='\[\e[1;30m\]\H:\W$(__git_ps1 "(%s)")\[\e[0;31m\]$([ $? == 0 ] && echo "\[\e[0;32m\]")$\[\e[0m\] '
- ホスト名を短い版 (
hostname -s
) を表示したければ\H
を\h
にする - カレントディレクトリをフルパスで表示したければ
\W
を\w
にする - ユーザーを切り替えることが多いサーバであればユーザー名
\u
を表示してもいいかもしれない
Bash の設定を再読み込み
ログインし直すか source ~/.bashrc
[追記]: 文字が真っ黒になってしまう場合
ターミナルの設定によっては文字が真っ黒になってしまうことがあるらしい。
\e[1;30m
は「明るい(1)黒(30) = Dark Gray」という意図で使っていたのだが、ANSI カラーシーケンスの Text Attribute の 1
はもともと Bold on
という意味なので1、これに従って「太字の(1)黒(30)」と解釈するターミナルだとこの現象が発生してしまう。
これを回避するには、素直に文字を白 \e[0;37m
に変えるか、ターミナルの設定で Text Attribute の 1
を「太文字」ではなく「明るい文字」として解釈するように設定する。