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

625
Android Eve

Als ich einen neuen Rechner für die Entwicklung vorbereitete, habe ich Cygwin und den CVS-Client wie in der Betreffzeile beschrieben aktualisiert: von (Cygwin 1.5.5-1 + CVS 1.11.21) auf (cygwin-1.7.5 + CVS 1.11.22)

Alles lief gut, aber ein einzeiliges Bash- Skript, das ich seit Jahren herumgetragen habe, hörte auf zu arbeiten. Es wurden alle uninteressanten Zeilen aus 'cvs status' herausgefiltert:

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

In der neuen Version schien es so, als ob "grep -v" einfach nicht mehr funktioniert (dh OUT wurde nicht gefiltert). Also habe ich versucht:

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

Das hat sich aber nicht geändert. Die Ausgabe war immer noch so, als ob "grep -v" nie aufgerufen wurde. Also habe ich versucht:

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

Und das hat das Problem gelöst! Das Skript verhält sich nun in (Cygwin 1.5.5-1 + CVS 1.11.21) und (cygwin-1.7.5 + CVS 1.11.22) identisch.

Meine Frage ist jetzt warum?

Was ist mit Cygwins Grep passiert, dass jetzt eine Umleitung von stderr nach stdout erforderlich ist?

Bitte beachten Sie, dass ich absichtlich das Wort betont Skript, weil der ursprüngliche Befehl (der erste oben zitierten) noch identisch in den alten und neuen Umgebungen arbeitet, wenn von der Kommandozeile eingegeben (dh nicht innerhalb einer #! / Bin / bash - Skript) .

Irgendeine Idee, warum das so ist?

1
Nicht hilfreich genug, um eine Antwort zu sein, aber ich habe immer festgestellt, dass http://andlinux.org benutzerfreundlicher ist als Cygwin. vor 14 Jahren 1
Interessant. Noch nie von Andlinux gehört. Vielen Dank, dass Sie mir andlinux.org vorgestellt haben. +1 dafür. Android Eve vor 14 Jahren 0

2 Antworten auf die Frage

1
garyjohn

Ich weiß es nicht genau, aber eine häufige Ursache dafür, dass Skripte nicht mit neueren Versionen von Cygwins Bash funktionieren, sind DOS (CR-LF) -Zeilenenden. Vielleicht hat Ihre letzte Änderung an diesem Skript auch das Zeilenende geändert. Stellen Sie sicher, dass Ihre Skripts nur Unix-Zeilenenden (LF) verwenden. Andernfalls wird das Musterargument von grep als "Aktuelles ^ M" angezeigt.

+1 für den Versuch, dieses Geheimnis zu enträtseln. Nein, das Problem liegt nicht im CRLF vs. LF-Ende. Da ich beide Versionen des Skripts mit dem gleichen exakten Zeilenende habe (ich verwende Emacs im Hexl-Modus, um genau zu sehen, was darin ist). Ich vermute, dass das Problem damit zusammenhängt, die Umgebung zu fälschen und / oder zu erben. Etwas hat sich geändert und ich vermute, es liegt in Cygwin, nicht in CVS. Android Eve vor 14 Jahren 0
0
Android Eve

Es ist Zeit, eine Antwort zu akzeptieren. Die einzige vernünftige Erklärung ist bisher, dass sich etwas in der Art und Weise geändert hat, wie Cygwins grep die Ausgabe in stderr und stdout aufteilt. Wenn eine bessere oder autoritärere Antwort eintritt, werde ich sie in Betracht ziehen.