bashのプロンプトに現在の時刻や、作業内容のメモを表示させる設定方法 †
本資料は、bashのプロンプトに各種情報を表示する設定方法を以下に記します。
関連記事 †
bashのプロンプト †
bashのプロンプトには、様々な情報を表示させることができます。
ホスト名や現在の作業ディレクトリを表示することは一般的な設定でしょう。
他にも様々な情報を表示させることが可能です。
以下はbashのプロンプトで使える特殊機能を持つ文字列です。
\d | 日付表示(曜日, 月 , 日) |
\D{format} | 時間表示。システムコール strfttime(3)のフォーマット文字列で指定 |
\h | ホスト名(ドメインパートを含まない) |
\H | ホスト名 |
\j | バックグラウンドで起動しているジョブの数 |
\l | 仮想端末の番号(pts/0, pts/1などの数字) |
\n | 改行(LF) |
\r | 改行(CR) |
\s | シェル名(bash) |
\t | 時刻表示(24時間表示 HH:MM:SS) |
\T | 時刻表示(12時間表示 HH:MM:SS) |
\@ | 時刻表示(12時間表示 HH:MM AM/PM) |
\A | 時刻表示(24時間表示 HH:MM) |
\u | ユーザ名 |
\v | bashのバージョン |
\V | bashのバージョン(パッチレベル含む) |
\w | 現在の作業ディレクトリ(フルパス表示) |
\W | 現在の作業ディレクトリ(現在のディレクトリ名のみ表示) |
\! | history上の番号 |
\# | bashが起動してからのコマンド番号 |
\$ | rootの場合には、# となり、それ以外のユーザでは $ となる |
\nnn | 8進数での文字指定(nは数字) |
\\ | \そのもの |
\[ | ターミナル操作用のシーケンス文字列の開始 |
\] | ターミナル操作用のシーケンス文字列の終了 |
プロンプトのカスタマイズ †
これらの特殊な文字列を、シェル変数のPS1に設定することで、プロンプトの表示を変えることができます。
例えば以下のように設定すると、
PS1="(\u@\H:\w \D{%FT%T})\n\\\$ "
プロンプトは以下のようになります。
(ユーザ名・ホスト名・現在のディレクトリ・現在時刻・改行・root時 #、一般ユーザ時 $ のプロンプト文字)
(root@ubuntu:~ 2013-08-15T00:18:33)
#
プロンプトはシェル変数や環境変数、コマンドの実行結果も表示することができます。
以下はwコマンドの同時ログインユーザ数をプロンプトに表示しています。
PS1="Now $(w | head -1 | awk '{print $6}') users login \$ "
プロンプトは以下のようになります。
Now 2 users login #
プロンプト情報の活用 †
プロンプトは端末上で常に表示されているものなので、この機能は状況によっては非常に役に立つものとなります。
例えば、プロンプトに以下のような情報を含めておけば、端末の出力をログとして保存して、
作業の証跡としてのログを振り返って確認するときには非常に有用となります。
現在時刻を表示させる †
上述のプロンプトでは現在の時刻が表示されています。
(リアルタイムに時刻表示がカウントアップするわけではないので、
プロンプトが表示された(先に実行したコマンドが完了した)瞬間の時刻ですが)
\D{%FT%T}が現在の日付と時刻を表示している部分です。この文字列指定で、
2013-08-15T00:18:52
のような時刻の表示フォーマット(ISO8601形式)としています。
これによって、作業履歴としてどの時間に何のコマンドを実行していたかというのを確実に把握することができます。
現在の作業内容のメモををプロンプトに含める †
自分が今何の作業をしているのか、もちろん自分が知っています。
しかし、証跡としてのログを振り返って確認するときにはそうとは限りません。
あるいは複数の作業を並列して実行しているときに、
どの端末でどの作業をしていたか混乱することもありえます。
常に表示されているプロンプトに、その端末で実施している作業内容が表示されていたら、
ケアレスミスの防止や未来での作業内容の確認時に非常に有益でしょう。
プロンプトに任意の文字列を随時設定する機能 †
プロンプトの設定はシェル変数PS1を変更するだけです。
しかし「現在の作業内容メモ」=「任意の文字列」を簡便に変更可能とする機能を、bashの関数として実装しました。
bashの関数として組み込む †
function caption() {
if [ x"$*" = x ]; then
CAPTION=""
else
CAPTION=" $*"
fi
PS1="(\u@\H:\w \D{%FT%T}${CAPTION})\n\\\$ "
}
これを.bashrcに追加すると通常のコマンドと同様に利用できます。
利用方法 †
- 通常状態では、ユーザ名とホスト名、カレントディレクトリ、そして現在時刻が表示されています。
#
(root@ubuntu:~ 2013-08-15T00:18:33)
#
- 作業開始です。
captionというコマンド(bash関数)に続いて、TEST01 STARTという文字列を与えて実行します。
# caption TEST01 START
(root@ubuntu:~ 2013-08-15T00:18:43 TEST01 START)
#
- プロンプトにTEST01 STARTが表示されています。
TEST01の作業中だということが(後から作業ログを見ても)判るでしょう。
作業(psの実行)を行います。
# ps
PID TTY TIME CMD
24062 pts/0 00:00:00 sudo
24063 pts/0 00:00:00 bash
24125 pts/0 00:00:00 ps
(root@ubuntu:~ 2013-08-15T00:18:52 TEST01 START)
#
- TEST01は完了したので、caption TEST01 ENDを実行します。
# caption TEST01 END
(root@ubuntu:~ 2013-08-15T00:18:57 TEST01 END)
#
- 続いて、TEST02を開始します。
captionでTEST02 1ST TRYと実行し、プロンプトの表示を変更します。
作業(pingの実行)を行います。
# caption TEST02 1ST TRY
(root@ubuntu:~ 2013-08-15T00:19:08 TEST02 1ST TRY)
# ping -c 1 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.053 ms
--- localhost ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.053/0.053/0.053/0.000 ms
(root@ubuntu:~ 2013-08-15T00:19:41 TEST02 1ST TRY)
#
- TEST02作業は完了しました。TEST02 ENDを打ち込みます。
# caption TEST02 END
(root@ubuntu:~ 2013-08-15T00:19:53 TEST02 END)
#
- すべての作業が完了したら、引数なしでcaptionを実行します。これまで表示されていた文字列は消えて通常状態のプロンプトに戻ります。
# caption
(root@ubuntu:~ 2013-08-15T00:19:57)
#
プロンプト文字列を設定するのは小技ですが、利用の仕方によっては、ミスの回避や過去の作業履歴を確認する際にかなり有用となります。
以上、bashのプロンプトに現在の時刻や、作業内容のメモを表示させる方法についてでした。