Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

$ 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 ~]#
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした