実行したコマンドの終了コードの確認をする場合ふつうは
$ command
$ echo $?
とか
$ command ; echo $?
のようにして確認したりする。
けれど、たまにecho $?
を打つのを忘れて次のコマンドを打ってしまったり、
コマンド → echo $?
を繰り返してhistoryが埋め尽くされてしまうことも。
なので、環境変数の PROMPT_COMMAND を使ってコマンドを打つたびに自動で戻り値を表示するようにしてみた。
bashのmanページに書いてある。
PROMPT_COMMAND 設定されていると、プライマリプロンプトを出す前に毎回、この値がコマンドとして実行されます。
/etc/bashrc
か~/.bashrc
に、以下のような記述を追加する。
追加する場所は、ファイルの最後のほうが良いっすね。
PROMPT_COMMANDにはコマンドが登録済みなので、それらより先にこの関数を呼ぶようにする(そうじゃないと意味ないので)。
${PROMPT_COMMAND//__show_status;/}
としているのは、~/.bashrc
を読みなおした時に__show_status
が重複登録されないように。
SETCOLORの辺りは /etc/init.d/functions
から。ただ表示するのも面白く無いので終了コードの範囲により色を変えるようにしてみた。
この例では、終了コードが0:緑、1~100:黄、101~:赤となる。
今のところ期待する動作をしているけど、Ctrl+C
を押下時には終了コードが130
になるようだけど、この関数では拾えていない。もうひと工夫必要なのかな?
:
:
function __show_status() {
local status=$(echo ${PIPESTATUS[@]})
local SETCOLOR_SUCCESS="echo -en \\033[1;32m"
local SETCOLOR_FAILURE="echo -en \\033[1;31m"
local SETCOLOR_WARNING="echo -en \\033[1;33m"
local SETCOLOR_NORMAL="echo -en \\033[0;39m"
local SETCOLOR s
for s in ${status}
do
if [ ${s} -gt 100 ]; then
SETCOLOR=${SETCOLOR_FAILURE}
elif [ ${s} -gt 0 ]; then
SETCOLOR=${SETCOLOR_WARNING}
else
SETCOLOR=${SETCOLOR_SUCCESS}
fi
done
${SETCOLOR}
echo "(rc->${status// /|})"
${SETCOLOR_NORMAL}
}
PROMPT_COMMAND='__show_status;'${PROMPT_COMMAND//__show_status;/}
# vim:ts=4:sw=4
実行結果
(rc->0)
[root@localhost ~]# test 0 == 0
(rc->0)
[root@localhost ~]# test 0 == 1
(rc->1)
[root@localhost ~]# command1
-bash: command1: コマンドが見つかりません
(rc->127)
[root@localhost ~]#