(Cygwin 1.5.5-1 + CVS 1.11.21) vs. (cygwin-1.7.5 + CVS 1.11.22)

1

Preparando uma nova máquina para desenvolvimento, atualizei o Cygwin e o cliente CVS conforme descrito na linha de assunto: de (Cygwin 1.5.5-1 + CVS 1.11.21) para (cygwin-1.7.5 + CVS 1.11.22 )

Tudo correu bem, mas um script de conveniência de 1 linha que carrego por anos parou de funcionar. Ele costumava filtrar todas as linhas desinteressantes de 'cvs status':

cvs status | grep -F File | grep -v Up-to-date

Na nova versão, parecia que "grep -v" simplesmente parou de funcionar (ou seja, não estava filtrando OUT). Então eu tentei:

cvs status 2>&1 | grep -F File | grep -v Up-to-date

Mas isso não mudou o comportamento. A saída ainda era como se "grep -v" nunca fosse chamado. Então, eu tentei:

cvs status 2>&1 | grep -F File 2>&1 | grep -v Up-to-date

E isso resolveu o problema! O script agora se comporta de forma idêntica em (Cygwin 1.5.5-1 + CVS 1.11.21) e (cygwin-1.7.5 + CVS 1.11.22).

Minha pergunta agora é por quê?

O que aconteceu com o grep do Cygwin que agora requer redirecionamento de stderr para stdout?

Por favor, note que eu intencionalmente enfatizei a palavra script , porque o comando original (o primeiro citado acima) ainda funciona identicamente em ambientes antigos e novos, se for digitado a partir da linha de comando (ou seja < em> não dentro de um script #! / bin / bash).

Alguma ideia do motivo?

    
por Android Eve 02.09.2010 / 03:15

2 respostas

0

É hora de aceitar uma resposta. A única explicação razoável até agora é que algo mudou na forma como o grep do Cygwin divide a saída para stderr e stdout. Se surgir uma resposta melhor ou mais autoritária, considerarei aceitá-la.

    
por 15.12.2010 / 23:55
1

Eu não sei ao certo neste caso, mas uma causa comum de scripts que não funcionam com versões mais novas do bash do Cygwin são os finais de linha do DOS (CR-LF). Talvez sua última alteração no script também tenha alterado o final da linha. Certifique-se de que seus scripts usem apenas finais de linha Unix (LF). Caso contrário, o grep verá seu argumento padrão como "Up-to-date ^ M".

    
por 02.09.2010 / 04:04