.bash_profile function executa a operação no mesmo diretório de arquivos

0

Eu tenho a seguinte função no meu .bash_profile:

function GIT_BRANCH() {

    STATUS="\$(git status 2> /dev/null)";

    if [[ ! ${STATUS} ]]; then
            if [[ ! ${STATUS} = *"working tree clean"* ]]; then
                    echo "not clean repo";
            else
                    echo "clean repo";
            fi
    else
            echo "not a repo";
    fi

}

Se eu executar o comando assim:

echo $(git status 2> /dev/null);
echo $(pwd);

então o comando infelizmente não é executado no mesmo diretório em que estou atualmente no shell.

Eu tentei resolver o problema como no exemplo a seguir.

STATUS="\$(git status 2> /dev/null)";

Isso funciona bem, desde que eu envie a variável com o eco. Se eu entendi isso corretamente, apenas a string é armazenada na variável e o comando não é executado ao comparar. Como faço para obter o valor de retorno do comando armazenado em STATUS e executar o comando no mesmo shell de qualquer maneira?

EDITAR:

Eu uso a função no PS1. Se eu tentar:

function GIT_BRANCH() {
    STATUS="\$(git status 2> /dev/null)";
    echo ${STATUS};
    TEST="\$(pwd)";
    echo ${TEST};
}

export PS1="$(COLOR "199")\u$RESET_ALL$(COLOR "45") \h \w$RESET_ALL $(COLOR "199")$(GIT_BRANCH $DIRE)$RESET_ALL\n$(COLOR "199")$ >$RESET_ALL "

Em seguida, tudo funciona bem e eu recebo o diretório atual. Mas isso não funciona se eu tentar usar essas informações na função em si, como nos exemplos que publiquei antes.

Obrigado pela sua ajuda.

    
por AuroraCore 10.07.2018 / 12:25

4 respostas

2

O seu problema está na cotação.

Você está basicamente configurando sua variável PS1 como

PS1="$(myfunction)"

(exportar PS1 não é necessário, pois é o shell atual que está usando apenas).

Isso chamará myfunction no momento da atribuição a PS1 e a função nunca mais será chamada.

Em vez disso, você deve usar

PS1='$(myfunction)'

Isso faria com que myfunction fosse chamado toda vez que o prompt fosse exibido.

Nenhuma citação especial é necessária na função em si.

Sua função:

function GIT_BRANCH() {

    STATUS="\$(git status 2> /dev/null)";

    if [[ ! ${STATUS} ]]; then
            if [[ ! ${STATUS} = *"working tree clean"* ]]; then
                    echo "not clean repo";
            else
                    echo "clean repo";
            fi
    else
            echo "not a repo";
    fi

}

Isso pode ser reescrito como

GIT_BRANCH () {
    local status="$( git status --porcelain 2>&1 )"

    case "$status" in
        *"fatal: not a git repository"*)
            echo 'Not a repo' ;;
        "")
            echo 'Clean repo' ;;
        *)
            echo 'Not clean repo' ;;
    esac
}

Ou usando as declarações if :

GIT_BRANCH () {
    local status="$( git status --porcelain 2>&1 )"

    if [[ "$status" == *"fatal: not a git repository"* ]]; then
        echo 'Not a repo'
    elif [[ -z "$status" ]]; then
        echo 'Clean repo'
    else
        echo 'Not clean repo'
    fi
}
    
por 10.07.2018 / 16:04
0

Use o parâmetro PROMPT_COMMAND

alux@deb904:~$ PROMPT_COMMAND=pwd
/home/alux
alux@deb904:~$ cd /tmp
/tmp
alux@deb904:/tmp$

Com sua função:

$ PROMPT_COMMAND=GIT_BRANCH
    
por 10.07.2018 / 16:38
0

O parâmetro PS1 é uma string estática, que pode ser personalizada inserindo-se vários caracteres especiais com escape de barra invertida (\ u, \ d, \ $, ...). Apenas essas tags são dinâmicas.

alux@deb904:~$ echo $PS1
\u@\h:\w\$
alux@deb904:~$ ps1="$PS1"

quando PS1 é avaliado com um comando (PS1 = $ (pwd) ou PS1 = 'pwd'), PS1 é avaliado com o retorno deste comando.

alux@deb904:~$ PS1="$(pwd) > "
/home/alux > echo $PS1
/home/alux >
/home/alux > cd /tmp
/home/alux > echo $PS1
/home/alux >
/home/alux > pwd
/tmp

O parâmetro PROMPT_COMMAND pode ser validado para conter uma linha de comando executada antes que o valor de PS1 seja exibido. Nós usamos uma função, é mais apropriado.

/home/alux > PS1=$ps1
alux@deb904:~$ myprompt(){ pwd; echo " > "; }
alux@deb904:~$ COMMAND_PROMPT=myprompt
/home/alux
>
alux@deb904:~$

Para evitar voltar à linha, use echo -n.

/home/alux
>
alux@deb904:~$ myprompt(){ echo -n "$(pwd) > "; }
/home/alux > alux@deb904:~$ cd /tmp
/tmp > alux@deb904:/tmp$

Podemos excluir o valor de PS1.

/tmp > alux@deb904:/tmp$PS1=
/tmp >

Mas não temos caracteres especiais que escaparam da barra invertida.

/tmp >  myprompt(){ echo -n "$(pwd) \u \h  > "; }
/tmp \u \h >

Então podemos usar outro parâmetro ($ USER, $ HOSTNAME, ...)

/tmp \u \h >  myprompt(){ echo -n "$(pwd) $USER $HOSTNAME  > "; }
/tmp alux deb906 >

O valor de PROMPT_COMMAND é executado antes da exibição do valor PS1. Portanto, podemos usar o PROMPT_COMMAND para modificar o PS1.

/tmp alux deb906  > myprompt(){ PS1=$(echo -n "$(pwd) (\h) > "); }
/tmp (deb904) > echo $PS1
/tmp (deb904) >
/tmp (deb904) > cd ~
/home/alux (deb904) > echo $PS1
/home/alux (deb904) >
/home/alux (deb904) > PROMPT_COMMAND=
/home/alux (deb904) > PS1=$ps1
alux@deb904:~$ 

Agora no seu .bash_profile:

function GIT_BRANCH() {
  local status="$(git status 2> /dev/null)"
  local msg
  if [ "${status}" ]; then
        if [ ! "${status}" = *"working tree clean"* ]; then
                msg="not clean repo"
        else
                msg="clean repo"
        fi
  else
        msg="not a repo"
  fi
  PS1="\u \h \w ${msg}\n\$ "
}
PROMPT_COMMAND=GIT_BRANCH
    
por 10.07.2018 / 20:19
-1

Use eval:

function GIT_BRANCH() {

  STATUS="\$(git status 2> /dev/null)";

  if [ "$(eval echo ${STATUS})" ]; then

        if [ ! $(eval echo ${STATUS}) = *"working tree clean"* ]; then
                echo "not clean repo";
        else
                echo "clean repo";
        fi
  else
        echo "not a repo";
  fi

}

Ou outra função adicional:

function STATUS(){
  git status 2> /dev/null
}
function GIT_BRANCH() {
  if [ "$(STATUS)" ]; then
    …
  fi
}
    
por 10.07.2018 / 14:35