1. ホーム
  2. linux

[解決済み] 最後の終了コードを表示するBashプロンプト

2023-05-13 21:36:16

質問

Bashプロンプトをカスタマイズして、次のように表示されるようにしようとしています。

[feralin@localhost ~]$ _

色で 一定の色(プロンプトを見るたびに同じ色)を得ることに成功しましたが、最後のコマンドがゼロ以外の終了状態であった場合、ユーザー名('feralin')を緑ではなく、赤で表示したいのです。私は思いつきました。

\e[1;33m[$(if [[ $? == 0  ]]; then echo "\e[0;31m"; else echo "\e[0;32m"; fi)\u\e[m@\e[1;34m\h \e[0;35m\W\e[1;33m]$ \e[m

しかし、私の観測では $(if ...; fi) は一度だけ評価されるようで、そのときに .bashrc が実行されたときに一度だけ評価され、 その後はずっとその結果が代入されるようです。このため、最後の終了コードが0以外であっても、名前は常に緑色になります(このように echo $? ). これは何が起こっているのでしょうか?それとも、単に私のプロンプトに何か他の問題があるのでしょうか?長い質問を短く どのように私は私のプロンプトが最後の終了コードを使用するようになりますか?

どのように解決するのですか?

複雑な境界線になりつつあるため PS1 を使うことを考えるかもしれません。 PROMPT_COMMAND . これを使うと、関数に設定することで、各コマンドの後に実行され、プロンプトが生成されます。

で以下を試すことができます。 ~/.bashrc ファイルに記述します。

PROMPT_COMMAND=__prompt_command    # Function to generate PS1 after CMDs

__prompt_command() {
    local EXIT="$?"                # This needs to be first
    PS1=""

    local RCol='\[\e[0m\]'

    local Red='\[\e[0;31m\]'
    local Gre='\[\e[0;32m\]'
    local BYel='\[\e[1;33m\]'
    local BBlu='\[\e[1;34m\]'
    local Pur='\[\e[0;35m\]'

    if [ $EXIT != 0 ]; then
        PS1+="${Red}\u${RCol}"        # Add red if exit code non 0
    else
        PS1+="${Gre}\u${RCol}"
    fi

    PS1+="${RCol}@${BBlu}\h ${Pur}\W${BYel}$ ${RCol}"
}

これで、あなたが望むようなことができるはずです。私の bashrc 's サブファイル でやっていることを全部見たいなら、私の __prompt_command 関数で行うすべてのことを見ることができます。