Ich bereitete eine neue Maschine für die Entwicklung vor und aktualisierte Cygwin und den CVS-Client wie in der Betreffzeile beschrieben: von (Cygwin 1.5.5-1 + CVS 1.11.21) auf (Cygwin-1.7.5 + CVS 1.11.22)
Alles ist gut gelaufen, aber ein einzeiliges Convenience-Bash- Skript, das ich seit Jahren bei mir habe, funktioniert nicht mehr. Es wurde verwendet, um alle uninteressanten Zeilen aus "cvs status" herauszufiltern:
cvs status | grep -F File | grep -v Up-to-date
In der neuen Version schien "grep -v" einfach nicht mehr zu funktionieren (dh es wurde nichts herausgefiltert). Also habe ich versucht:
cvs status 2>&1 | grep -F File | grep -v Up-to-date
Daran hat sich aber nichts geändert. Die Ausgabe war immer noch so, als würde "grep -v" nie aufgerufen. Also habe ich versucht:
cvs status 2>&1 | grep -F File 2>&1 | grep -v Up-to-date
Und das löste das Problem! Das Skript verhält sich jetzt identisch in (Cygwin 1.5.5-1 + CVS 1.11.21) und (Cygwin-1.7.5 + CVS 1.11.22).
Meine Frage ist jetzt warum?
Was ist mit Cygwins Grep passiert, dass jetzt eine Umleitung von stderr zu stdout erforderlich ist?
Bitte beachten Sie, dass ich das Wort script absichtlich hervorgehoben habe , da der ursprüngliche Befehl (der erste oben genannte) in alten und neuen Umgebungen immer noch identisch funktioniert, wenn er über die Befehlszeile eingegeben wird (dh nicht in einem #! / Bin / bash-Skript). .
Irgendeine Idee warum das so ist?
Antworten:
Ich weiß es in diesem Fall nicht genau, aber eine häufige Ursache dafür, dass Skripte mit neueren Versionen von Cygwins Bash nicht funktionieren, sind DOS-Zeilenenden (CR-LF). Vielleicht hat Ihre letzte Änderung an diesem Skript auch das Zeilenende geändert. Stellen Sie sicher, dass Ihre Skripte nur Unix (LF) -Zeilenenden verwenden. Andernfalls sieht grep das Musterargument als "Up-to-date ^ M".
quelle
Es ist Zeit, eine Antwort zu akzeptieren. Die einzige vernünftige Erklärung ist, dass sich etwas in der Art und Weise geändert hat, wie Cygwins Grep die Ausgabe in stderr und stdout aufteilt. Wenn es eine bessere oder verbindlichere Antwort gibt, werde ich in Betracht ziehen, sie zu akzeptieren.
quelle