2012-08-08 4 views
6

(非ゼロの場合)私は現在、最後のコマンド実行の戻りコードを出力する関数を呼び出すbashでプロンプトを持っている:$?のために別のコマンドがない限りリセットしない以外これは、うまくむしろ作品

exit_code_prompt() 
{ 
    local exit_code=$? 
    if [ $exit_code -ne 0 ] 
    then 
     tput setaf 1 
     printf "%s" $exit_code 
     tput sgr0 
    fi 
} 


PS1='$(exit_code_prompt)\$ ' 

実行されます。

$ echo "works" 
works 
$ command_not_found 
bash: command_not_found: command not found 
127$ 
127$ 
127$ 
127$ echo "works" 
works 
$ 

それは親のために$?の値が初めてexit_code_prompt()が、それは、プロンプトに値を繰り返すように続けないように実行されるシェル/リセットすることが可能に設定されていませんか?

多くのおかげで、スティーブ。

+0

なぜこれをやりたいですか? コマンドラインで手動でスクリプトスニペットをテストしたい場合は、これがさらに問題になることがあります。 – anishsane

答えて

3

別のコマンドを発行しないと、$?は変更されません。だからあなたのプロンプトが再評価されると、それは正しく127を放出しています。プロンプトで手動で別のコマンドを入力する以外は、実際には回避策はありません。

編集:実は私は、常に状態を保存する方法があります嘘をついたので、あなたは$?の値を格納し、それがを変更しますかどうかを確認し、それが持っている場合は、プロンプトをクリアすることができます。しかし、あなたがサブシェルに入っているので、あなたの選択肢はかなり制限されています。値を格納するためにファイルや同等のものを使用する必要があります。

+1

状態を保存する必要はありません。単にprintfの後にリセットするだけです.0と等しくなければ---私はそれをやりたいと思っていますが、方法はありません(そして/または可能ならば) –

+0

@StephenWattamしかしifあなたは状態を保存しません。コマンドの直後に続くプロンプトとコマンドに続くプロンプトとの違いをどうやって分かりますか? – kojiro

+0

私はこれとは異なる角度から来ていました。状態として '$? 'を使い、1つの出力の後に0に設定しました。 –

関連する問題