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

1

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?

Android Eve
quelle
1
Nicht hilfreich genug, um eine Antwort zu sein, aber ich habe andlinux.org immer als viel benutzerfreundlicher als Cygwin empfunden .
Interessant. Noch nie von andlinux gehört. Vielen Dank, dass Sie mir andlinux.org vorgestellt haben. +1 dafür.
Android Eve

Antworten:

1

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".

garyjohn
quelle
+1 für den Versuch, dieses Geheimnis zu entschlüsseln. Nein, das Problem liegt nicht in der Endung CRLF vs. LF. Da ich beide Versionen des Skripts mit derselben exakten Zeilenendung habe (ich verwende Emacs im Hexl-Modus, um genau zu sehen, was darin enthalten ist). Ich vermute, das Problem hat mit dem Verzweigen und / oder dem Erben der Umgebung zu tun. Etwas hat sich geändert und ich vermute, es liegt in Cygwin, nicht in CVS.
Android Eve
0

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.

Android Eve
quelle