コマンド返り値でプロンプト変更

コマンドが失敗したらプロンプトを赤くする - blog.8-p.info
zsh以外ではどうすればいいかな。
たとえば、exitシステムコールのみを積んだバイナリを用意して、LD_PRELOADに置いたらどうだろう。exit()はステータスコードを受け取り、プロンプト用の変数(bashなら$PS1)を適度に設定して、受け取ったステータスコードであらためてexitシステムコールを呼ぶ。システムコールであっても、プロトタイプ宣言が一緒ならこっちが呼ばれる……よね?


ヒマがあったらあとで試す。

追記

試すまでもなかった。
exitシステムコールをフックできちゃったら、exitシステムコール呼べないじゃん……! 無限ループ→スタックオーバーフローに陥るのは目に見えている。
やっぱり何かしらシェルの機能がないと無理っぽいなぁ。gcc独自拡張の関数使うと呼ばれないこともありそうだし……

追記(2009/01/06)

bashではPROMPT_COMMAND環境変数でできるらしい。

export PS1="\[\033[01;32m\]\h\[\033[01;34m\] \W \$\[\033[00m\] "
prompt_func()
{
    if [ $? -eq 0 ]; then
        PS1="\[\033[01;32m\]\h\[\033[01;34m\] \W \$\[\033[00m\] "
    else
        PS1="\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] "
    fi
}
PROMPT_COMMAND=prompt_func

.bashrcをこんな感じにしてみた。


参考:
Loading...
http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-3.html