Готовя новую машину к разработке, я обновил Cygwin и клиент CVS, как описано в строке темы: от (Cygwin 1.5.5-1 + CVS 1.11.21) к (cygwin-1.7.5 + CVS 1.11.22)
Все подходили, но сценарий удара удобства с 1 строкой, который я нес вокруг в течение многих лет, прекратил работать. Это раньше отфильтровывало все неинтересные строки от 'cvs состояние':
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).
Мой вопрос теперь состоит в том почему?
Что произошло с grep Cygwin, что он теперь требует перенаправления от stderr до stdout?
Обратите внимание на то, что я намеренно подчеркнул сценарий слова, потому что исходная команда (первая, заключенная в кавычки выше) все еще, работает тождественно и в старых и в новых средах, если введено из командной строки (т.е. не в #!/bin/bash сценарий).
Какая-либо идея, почему это?
Пора принять ответ. Единственное разумное объяснение до сих пор состоит в том, что что-то изменило в них способ, которым grep Cygwin разделяет вывод к stderr и stdout. Если лучший или более авторитетный ответ придет, то я рассмотрю принятие его.
Я не знаю наверняка в этом случае, но частой причиной сценариев, не удающихся работать с более новыми версиями удара Cygwin, является DOS (CR-LF) окончания строки. Возможно, Ваше последнее изменение в том сценарии также изменило окончание строки. Удостоверьтесь, что Ваши сценарии используют только Unix (LF) окончания строки. Иначе grep будет рассматривать свой аргумент шаблона как "Up-to-date^M".