この記事は?
- SSHなどでサーバ間を移動していると、うっかり思っていたサーバと違う場所で作業してしまった、というようなことがあったりする。
- 本来、そのようなことはあってはいけない。個人環境ならテヘヘ、で済むものの、お仕事として考えればオペミスってやつだ。
- 少しでもそのようなことがなくなるように、プロンプトの色を変えることで多少は視覚的に変化を与え、人間が気付きを得られるようにしよう、という試みを行う。
前提条件
- SSHの方法だとか、ホスト名の命名ルールだとか、そういった箇所でも気付きを得られるべきなのですが、ここではbashプロンプトにのみ、限った話にしようと思います。
- bashrcに対する設定を行うので、お仕事上、なかなか設定を仕込みにくい現場もあるかもしれませんがそこはお察しください。
仕込みたいこと
下記の内容をbashに仕込もうと思います。
- SSHログインした先のサーバがどこなのか、色分けしてわかるようにする。
- 特権管理者(root)にsu した場合、rootであることをわかりやすくしたい。
実装
実装方法
bashでは環境変数:PS1にてプロンプトが定義されている。
ちなみにPS1は通常のプロンプトで、PS2はコマンド入力が完了していないときに表示される。PS3とPS4はプログラミングとデバッグ用。
[hiroki.lzh@StarPlatinum ~]$ echo $PS1
[\u@\h \W]\$
[hiroki.lzh@StarPlatinum ~]$ echo $PS2
>
[hiroki.lzh@StarPlatinum ~]$ echo $PS3
[hiroki.lzh@StarPlatinum ~]$ echo $PS4
+
このPS1に対し以下のような特殊文字などを使用できるので、これらを組み合わせてオリジナルプロンプトを作成する。
特殊文字 | 内容 |
---|---|
\d | 「曜日 月 日」の形式(例:Fri Jan 5)で日付を表示する |
\e | ASCIIのエスケープ文字(033)を表示する |
\h | ホスト名のうち最初の「.」までの部分を表示する |
\H | ホスト名を表示する |
\n | 改行する |
\s | シェルの名前を表示する |
\t | 現在の時刻を24時間の「HH:MM:SS」形式で表示する |
\T | 現在の時刻を12時間の「HH:MM:SS」形式で表示する |
@ | 現在の時刻を12時間の「am/pm」形式で表示する |
\u | 現在のユーザー名を表示する |
\w | 現在の作業ディレクトリを、ユーザーのホームディレクトリからの絶対パスで表示する |
\W | 現在の作業ディレクトリを表示する |
\! | このコマンドの履歴番号を表示する |
\# | このコマンドのコマンド番号(現在のシェルのセッション中に実行されたコマンドのシーケンスにおける位置)を表示する |
\$ | 実効UIDが0の場合に#となり、それ以外の場合に$となる |
\nnn | 8進数nnnに対応する文字を表示する |
\[ | 非表示文字のシーケンスを開始する。これを使って、プロンプト中に端末の制御シーケンスを埋め込むことができる |
\] | 非表示文字のシーケンスを終了する |
サーバ名を色分けする
一例として、私はこうした。
$ vi .bashrc
PS1="[\u@\[\e[0;35m\]\h\[\e[0m\]]\\$ "
$ source ~/.bashrc
結果、こうなる。「0;35m」が「通常文字でピンク色」を指定している。
rootになった場合にユーザ名を色分けする
一例として、私はこうした。
# vi .bashrc
PS1="[\[\e[1;31m\\]\u\[\e[0m\]@\[\e[0;35m\]\h\[\e[0m\]]\\$ "
# source ~/.bashrc
結果、こうなる。「1;31m」が「太文字で赤色」を指定している。
ちなみに、
「0;31m」が「太文字で赤色」
「1;31m」が「太文字で赤色」
「4;31m」が「下線つきの文字で赤色」
なのでお好みに合わせてどうぞ。
おまけ
色がつくことによってログをcatしたりgrepしたりしたときに、「どこから実行したんだっけ?」とスクロールして戻るときにポイントを見つけやすくなった。少し得した気分である。
参考
以上