87

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、結果がその後永久に置き換えられるようです。これにより、最後の終了コードがゼロ以外の場合でも、名前は常に緑色になります (のようにecho $?)。これは何が起こっているのですか?それとも、単に私のプロンプトに何か問題がありますか? 短い質問ですが、最後の終了コードを使用するようにプロンプ​​トを表示するにはどうすればよいですか?

4

8 に答える 8

7

デフォルトのDebianの色を維持し、正確なコードを印刷し、失敗した場合にのみ印刷したかったのです。

# Show exit status on failure.
PROMPT_COMMAND=__prompt_command

__prompt_command() {
    local curr_exit="$?"

    local BRed='\[\e[0;91m\]'
    local RCol='\[\e[0m\]'

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

    if [ "$curr_exit" != 0 ]; then
        PS1="[${BRed}$curr_exit${RCol}]$PS1"
    fi
}
于 2016-09-11T16:24:17.550 に答える
0

元のプロンプト形式 (色だけでなく) を保持するには、ファイルの最後に次を追加できます~/.bashrc

PS1_ORIG=$PS1 # original primary prompt value
PROMPT_COMMAND=__update_prompt # Function to be re-evaluated after each command is executed
__update_prompt() {
    local PREVIOUS_EXIT_CODE="$?"
    if [ $PREVIOUS_EXIT_CODE != 0 ]; then
        local RedCol='\[\e[0;31m\]'
        local ResetCol='\[\e[0m\]'
        local replacement="${RedCol}\u${ResetCol}"
    
        # Replace username color
        PS1=${PS1_ORIG//]\\u/]$replacement}
        ## Alternative: keep same colors, append exit code
        #PS1="$PS1_ORIG[${RedCol}error=$PREVIOUS_EXIT_CODE${ResetCol}]$ "
    else
        PS1=$PS1_ORIG
    fi
}

ユーザー名の色を保持し、元のプロンプト形式の最後に赤のエラー コードを追加する代替アプローチについてのコメントも参照してください。

于 2020-06-03T11:45:00.107 に答える