BASH:後でPS1で使用するためにPS1に終了コードを保存する方法は?

BASH:後でPS1で使用するためにPS1に終了コードを保存する方法は?

次の方法でPS1をカスタマイズしようとしています(色を削除しました)。

PS1='\u@\h:\w$(git_branch)$(useExitCode)\$ '

どこ

git_branch()
{
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

退室状況はピックアップしたいです。今後関数git_branchが実行されてから使用されますuseExitCode。どうすればいいですか?後者の関数は次のとおりです。

useExitCode()
{
    local exitCode=${1}

    if [[ ${exitCode} == 0 ]]; then
        echo ':)'
    else
        echo ':('
    fi
}

問題は、PS1に終了コードをどのように保存し、後で使用できるかということです。

次のことはうまくいきませんが、一般的な方向のアイデアを提供します。

PS1='exitCode=$?\u@\h:\w$(git_branch)$(useExitCode ${exitCode})\$ '

上記のechoは「exitCode = 0」(または= 1)部分ですが、保存されていないため、後で「$ {exitCode}」を呼び出すと空です。

答え1

PROMPT_COMMANDこれには変数を使用します。

PROMPT_COMMAND='lstatus=$?'
PS1='$(false)$(exit 3)<$lstatus> '

<0> sh -c 'exit 17'
<17> echo $?
17
<0>

bash(1)マンページから:

PROMPT_COMMAND設定すると、この値はコマンドとして実行されます。以前すべての主要なヒントを送信してください。

答え2

gitプロンプトで同様の操作を行いました。

 parse_git_branch() {
     exit_code=$?
     local stdcolor
     local branchcolor
     local lines
     stdcolor="^[[0;32m"
     if [[ -d ./.git ]] || $( git status > /dev/null 2>&1 ); then
        lines=$(git status -s | wc -l)
        if [[ 0 -eq ${lines} ]]; then
           # Working copy is clean
           branchcolor="^[[1;32m"
        elif git status -s 2> /dev/null | grep -q '^A'; then
           # If we have staged commits waiting, red; else yellow
           branchcolor="^[[1;31m"
        else
           branchcolor="^[[1;33m"
        fi
        git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ $stdcolor($branchcolor\1$stdcolor)/"
     fi
     return $exit_code
  }
  export PS1='\[\e]0;\u@\h: \w\a\]\[\e[38;5;14m\]\u\[\e[38;5;8m\]@\[\e[38;5;6m\]\h\[\e[38;5;8m\]:\[\e[38;5;10m\]\w'"\$(parse_git_branch) \e[31m\${?##0}\n"'\[\e[$(((($?>0))*31))m\]\$\[\e[0m\] '

(クリーン)結果プロンプトとワークスペースで表示される方法git

me@host:~/src/project (devel)
$ false
me@host:~/src/project (devel)  1
$ true
me@host:~/src/project (devel) 
$

これらの結果はすべて次のとおりです。

  • ワークスペースにある場合は、git現在のブランチが表示されます。緑色はきれい、黄色は汚れ、赤色は送信待ちの一時ファイルがあることを意味します。
  • 最後のコマンドにゼロ以外の終了コードがある場合は、プロンプト(赤)に表示され、まだアクセスできます$?

関連情報