准备一台新机器用于开发,我升级了 Cygwin 和 CVS 客户端,如主题行中所述:从(Cygwin 1.5.5-1 + CVS 1.11.21)到(cygwin-1.7.5 + CVS 1.11.22)
一切顺利,但一行便利脚本我已经随身携带多年,但停止工作了。它曾经过滤掉“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 脚本中)。
知道这是为什么吗?
答案1
在这种情况下,我不确定,但脚本无法与较新版本的 Cygwin 的 bash 一起使用的一个常见原因是 DOS (CR-LF) 行尾。也许您对该脚本的最后一次更改也改变了行尾。确保您的脚本仅使用 Unix (LF) 行尾。否则,grep 会将其模式参数视为“Up-to-date^M”。
答案2
是时候接受答案了。到目前为止,唯一合理的解释是 Cygwin 的 grep 将输出拆分为 stderr 和 stdout 的方式发生了一些变化。如果有更好或更权威的答案,我会考虑接受它。