Grep ignora parte do meu padrão?

3

Eu tenho um bom script bash/zenity que eu uso para verificar / atualizar um número de git repos e relatar o status de cada um como este - mostrando apenas um exemplo de repositório aqui:

zenity --class=CheckGit --info title="Check git updates" --text="\n \
<b>MY-GIT-REPO:</b> $(cd "/home/ME/.local/share/git/MY-GIT-REPO" && git pull | grep -E '(up-to-date|changed)')"

Ele estava funcionando bem até que encontrei um erro devido a uma alteração em um dos arquivos locais, o que resultou em uma linha em branco para o repositório.

A saída do terminal foi assim:

error: Your local changes to the following files would be overwritten by merge:
    xxx/yyy
Please, commit your changes or stash them before you can merge.
Aborting

Então eu modifiquei o comando grep assim: grep -E '(up-to-date|changed|error)' para também exibir essas mensagens. Mas, para minha surpresa, ainda se recusou a mostrar qualquer coisa.

Como novato no bash scripting, não entendo o que está causando isso. Como o grep exibe linhas contendo as palavras "up-to-date" ou "changed", mas não "error"? .. Esta palavra tem um significado especial? Nesse caso, como posso mostrar uma mensagem de erro?

    
por Sadi 11.06.2015 / 09:45

1 resposta

3

O Git escreve seus erros no stderr, para que você não os perca se você redirecionar a saída normal (para um arquivo ou, no seu caso, para um programa).

Você pode tentar:

zenity --class=CheckGit --info title="Check git updates" --text="\n \
<b>MY-GIT-REPO:</b> $(cd "/home/ME/.local/share/git/MY-GIT-REPO" && git pull 2>&1 | grep -E '(up-to-date|changed|error)')"
    
por 11.06.2015 / 09:55

Tags