web-dev-qa-db-ja.com

最終終了コードでのBashプロンプト

だから、私はそれが次のようになるように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 $?_など)でも、名前は常に緑色になります。これは何が起こっているのですか?それとも、それは単に私のプロンプトで何か他のものが間違っていますか?長い質問の短い、最後の終了コードを使用するようにプロンプ​​トを取得するにはどうすればよいですか?

53
feralin

複雑なPS1に接し始めているので、Prompt_COMMAND
これにより、関数に設定し、プロンプトを生成する各コマンドの後に実行されます。

~/.bashrc

Prompt_COMMAND=__Prompt_command # Func to gen 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の sub file を見て、___Prompt_command 関数。

92
demure

[プロンプト]コマンドを使用したくない場合は、次の2つの点を考慮する必要があります。

  1. $の値を取得しますか?それ以外の場合は、オーバーライドされます
  2. pS1のすべての$をエスケープします(割り当てたときに評価されません)。

変数を使用した作業例

_PS1="\$(VALU="\$?" ; echo \$VALU ; date ; if [ \$VALU == 0 ]; then echo zero; else echo nonzero; fi) " 
_

変数なしの実例

ここでは、_$?_をオーバーライドするコマンドの前に、ifを最初にする必要があります。

_PS1="\$(if [ \$? == 0 ]; then echo zero; else echo nonzero; fi) "
_

\$()がどのようにエスケープされるのかに注意してください。すぐに実行されませんが、PS1が使用されるたびに実行されます。また、_\$?_のすべての使用

15
helios

デフォルトの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
}
3
Velkan

@demureの改善

終了ステータスが常に0または1であるとは限らないため、これは重要だと思います。

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