4

私のgitブランチ情報(gitのbash-completionから__git_ps1を使用)と、最近実行されたコマンドが成功したかどうかを示す小さな色付きのスマイリーの両方を持つBashプロンプトを作成しようとしています。

スマイリーは、SO で見つけたこの手法を使用して作成されます。

SMILEY="${GREEN}:)${COLOR_NONE}"
FROWNY="${RED}:(${COLOR_NONE}"
STATUS_EMOTICON="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

使用したいプロンプト行は次のとおりです。

export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${GREEN}\$(__git_ps1 ' %s')${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ "

$?残念ながら、__git_ps1 によって実行されるプログラムが値をオーバーライドしているように見えますfalse

__git_ps1 呼び出しを取り出しています...

export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ "

...絵文字が正しく機能するようにします。

したがって、実行する${STATUS_EMOTICON} 前に評価する必要があるようですが、の出力の__git_ps1に評価された値を含めます。それは可能ですか? __git_ps1

4

1 に答える 1

7

$(cmd)または`cmd`を に直接入れないでくださいPS1。代わりに、Bash のPROMPT_COMMANDvar. 私が通常行うことは、関数_PS1_cmdと setを定義することPROMPT_COMMAND=_PS1_cmdです。次に、_PS1_cmdに含めたいその他の変数を設定しPS1ます。例えば:

THE-OLD-PROMPT # cat prompt.rc
function _PS1_cmd()
{
    local saveExit=$?

    # This non-zero exit will not affect $? on command line
    g_git_ps1=$( echo TESTING; exit 1 )
    if (( saveExit )); then
        g_smiley=':('
    else
        g_smiley=':)'
    fi

    # Seems like this is not necessary, at least with bash 4.2.37. But
    # to be safe, always return it.
    return $saveExit
}

PROMPT_COMMAND=_PS1_cmd
PS1='$g_git_ps1 $g_smiley '
THE-OLD-PROMPT # source ./prompt.rc
TESTING :) ( exit 123 )
TESTING :( echo $?
123
TESTING :) echo $?
0
TESTING :)
于 2013-03-28T03:05:13.793 に答える