LoginSignup
94
87

More than 5 years have passed since last update.

実行したコマンドの終了コードを表示する

Last updated at Posted at 2013-11-07

実行したコマンドの終了コードの確認をする場合ふつうは

$ 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になるようだけど、この関数では拾えていない。もうひと工夫必要なのかな?

/etc/bashrc
:
:
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 ~]#
94
87
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
94
87