(Cygwin 1.5.5-1 + CVS 1.11.21) против (cygwin-1.7.5 + CVS 1.11.22)

443
Android Eve

Готовя новый компьютер к разработке, я обновил 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) ,

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

1
Не достаточно полезен, чтобы быть ответом, но я всегда считал http://andlinux.org гораздо более удобным, чем Cygwin. 14 лет назад 1
Интересно. Никогда не слышал об andlinux раньше. Спасибо за представление andlinux.org для меня. +1 за это. Android Eve 14 лет назад 0

2 ответа на вопрос

1
garyjohn

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

+1 за попытку разгадать эту тайну. Нет, проблема не в финале CRLF против LF. Поскольку у меня есть обе версии скрипта с одинаковым окончанием строки (я использую Emacs в hexl-режиме, чтобы точно увидеть, что в нем). Я подозреваю, что проблема связана с разветвлением и / или наследованием окружения. Что-то изменилось, и я подозреваю, что это в Cygwin, а не в CVS. Android Eve 14 лет назад 0
0
Android Eve

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

Похожие вопросы