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.
(Cygwin 1.5.5-1 + CVS 1.11.21) vs. (Cygwin-1.7.5 + CVS 1.11.22)
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?
2 Antworten auf die Frage
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.
Verwandte Probleme
-
3
Wie kann ich eine Verzeichnisstruktur "invertieren"?
-
1
Pausieren Sie alle Aufgaben außer x CPU-intensiven Aufgaben
-
7
Starten Sie den Synergy-Client beim Booten in Mac OS X
-
6
Welche zsh-Funktionen verwenden Sie?
-
4
Wie synchronisieren Sie GreaseMonkey-Skripts zwischen Computern?
-
5
Transparente Eingabeaufforderung in Vista?
-
4
Verwenden Sie den Windows-Aktenkoffer von der Befehlszeile aus
-
4
Warum sind einige Befehle nicht vorhanden?
-
11
Gibt es eine einfache Möglichkeit, MP3-Dateien zu teilen?
-
4
Cygwin-Eingabeaufforderung ändern