BASH: como posso salvar o código de saída no PS1 para usá-lo posteriormente no PS1?

0

Estou tentando personalizar meu PS1 da seguinte maneira (removi as cores):

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

onde

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

Quanto ao status de saída, eu gostaria de pegá-lo antes que a função git_branch seja executada e usá-lo em useExitCode . Como eu posso fazer isso? A última função poderia ser assim:

useExitCode()
{
    local exitCode=${1}

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

A pergunta é: como posso armazenar o código de saída no PS1 e usá-lo depois?

Algo parecido com o seguinte não funciona, mas dá uma ideia da direção geenral:

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

O echo acima é a parte "exitCode = 0" (ou = 1), mas ele não é armazenado, então fica vazio em sua invocação "$ {exitCode}" mais tarde.

    
por nass 26.10.2018 / 00:24

2 respostas

1

Eu usaria a variável PROMPT_COMMAND para isso:

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

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

Na% man_de% manpage:

PROMPT_COMMAND If set, the value is executed as a command prior to issuing each primary prompt.

    
por 26.10.2018 / 00:53
1

Eu faço algo semelhante com o meu prompt, e aqui está como eu vou um "obter o ramo git no meu prompt enquanto ainda mostra o código de saída do último comando" coisa:

 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$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\] '

O prompt resultante (higienizado) e sua aparência em uma área de trabalho git :

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

O resultado de tudo isso é que:

  • Se eu estiver em um espaço de trabalho git , minha ramificação atual será mostrada. Verde se estiver limpa, amarela se estiver suja e vermelha se houver arquivos de teste aguardando uma confirmação
  • Se o código de saída do último comando era diferente de zero, ele é mostrado (em vermelho) no prompt e ainda tenho acesso a $? .
por 26.10.2018 / 00:43