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현재 분기가 표시됩니다. 녹색은 깨끗함을, 노란색은 더러움을, 빨간색은 제출 대기 중인 임시 파일이 있음을 의미합니다.
  • 마지막 명령에 0이 아닌 종료 코드가 있으면 프롬프트(빨간색)에 표시되고 여전히 액세스할 수 있습니다 $?.

관련 정보