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


1

개발을 위해 새 머신을 준비하면서 제목 줄에 설명 된대로 Cygwin 및 CVS 클라이언트를 (Cygwin 1.5.5-1 + CVS 1.11.21)에서 (cygwin-1.7.5 + CVS 1.11.22)로 업그레이드했습니다.

모든 것이 잘되었지만 몇 년 동안 가지고 다니는 한 줄 편의 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).

내 질문은 지금 왜?

Cygwin의 grep은 stderr에서 stdout으로 리디렉션해야하는 상황은 무엇입니까?

명령 행에서 입력하면 (예 : #! / bin / bash 스크립트가 아닌 ) 원래 명령 (위의 첫 번째 명령)이 이전 환경과 새 환경 모두에서 동일하게 작동하므로 script 라는 단어를 의도적으로 강조했습니다 . .

이것이 왜 그런지 아십니까?


1
답이 될만큼 도움이되지는 않았지만 항상 andlinux.org 가 Cygwin보다 훨씬 사용자 친화적 인 것으로 나타 났습니다 .

흥미 롭군 andlinux에 대해 들어 본 적이 없습니다. andlinux.org를 소개해 주셔서 감사합니다. +1입니다.
Android Eve

답변:


1

이 경우 확실하지는 않지만 최신 버전의 Cygwin bash에서 작동하지 않는 일반적인 원인은 DOS (CR-LF) 줄 끝입니다. 아마도 해당 스크립트를 마지막으로 변경했을 때 줄 끝이 변경되었을 수도 있습니다. 스크립트가 Unix (LF) 줄 끝만 사용해야합니다. 그렇지 않으면 grep은 패턴 인수를 "최신 ^ M"으로 표시합니다.


이 수수께끼를 해독하려고 +1. 아니요, CRLF 대 LF 결말에는 문제가 없습니다. 정확한 줄 끝이있는 두 버전의 스크립트가 모두 있으므로 (hexl 모드에서 Emacs를 사용하여 정확히 무엇이 있는지 확인하십시오). 문제는 환경을 포크하거나 상속하는 것과 관련이 있다고 생각합니다. 무언가가 바뀌었고 CVS가 아닌 Cygwin에 있다고 생각합니다.
Android Eve

0

이제 대답을 받아 들일 시간입니다. 지금까지 유일한 합리적인 설명은 Cygwin의 grep이 stderr과 stdout으로 출력을 나누는 방식으로 무언가가 변경되었다는 것입니다. 더 나은 또는 더 권위있는 답변이 나오면 나는 그것을 수락하는 것을 고려할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.