1

Готовя новый компьютер к разработке, я обновил Cygwin и клиента CVS, как описано в строке темы: с (Cygwin 1.5.5-1 + CVS 1.11.21) до (cygwin-1.7.5 + CVS 1.11.22)

Все прошло хорошо, но 1-строчный удобный bash- скрипт, который я нес много лет, перестал работать. Раньше он отфильтровывал все неинтересные строки из 'cvs status':

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

В новой версии казалось, что «grep -v» просто перестал работать (т.е. ничего не фильтровал). Итак, я попробовал:

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

Но это не изменило поведение. Вывод все еще был таким, как будто grep -v никогда не вызывался. Итак, я попробовал:

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

И это решило проблему! Теперь скрипт ведет себя одинаково в (Cygwin 1.5.5-1 + CVS 1.11.21) и (cygwin-1.7.5 + CVS 1.11.22).

Мой вопрос сейчас почему?

Что случилось с greg Cygwin, что теперь требуется перенаправление с stderr на stdout?

Обратите внимание, что я намеренно выделил слово script, потому что исходная команда (первая, приведенная выше) по-прежнему одинаково работает как в старой, так и в новой среде, если она набирается из командной строки (то есть не внутри #!/bin/bash script).

Есть идеи, почему это так?

2 ответа2

1

В этом случае я точно не знаю, но распространенной причиной того, что скрипты не работают с более новыми версиями Cygwin bash, являются окончания строки DOS (CR-LF). Возможно, ваше последнее изменение в этом сценарии также изменило окончание строки. Убедитесь, что в ваших скриптах используются только окончания строк Unix (LF). В противном случае, grep увидит свой аргумент шаблона как «Обновленный ^ M».

0

Пришло время принять ответ. Пока единственное разумное объяснение состоит в том, что что-то изменилось в том, как grep Cygwin разделяет вывод на stderr и stdout. Если придет лучший или более авторитетный ответ, я рассмотрю его принятие.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .