带有 grep 的 fswatch 没有管道

fswatch with grep not piping

我想在每次保存时通过我的单元测试框架使用 fswatch 运行 文件。

作为测试,我 运行 fswatch 并在我的文本编辑器中对 /my/path/test.txt 做了一个小改动,得到了我预期的输出:

$ fswatch . | xargs -I {} echo {} {}
/my/path/test.txt /my/path/test.txt

但是如果我在中间插入一个 grep 并重复这个过程,我就没有输出:

$ fswatch . | grep test | xargs -I {} echo {} {}

我做错了什么?

编辑

fswatch + grep 本身工作正常

$ fswatch . | grep test
/my/path/test.txt

man grep:

   --line-buffered
          Use line buffering on output.   This  can  cause  a  performance
          penalty.

当使用 grep 作为最后一个管道命令时,linebuffered 是默认设置。

如前所述,--line-buffered 告诉 grep not 到 block-buffer 输出,因此立即将整行写入标准输出。 Block-buffering 是 grep 写入管道时的默认行为,line-buffering 是写入终端时的默认行为。

现在:如 fswatch 文档中所述,文件名 可以 包含换行符。因此 -0 的存在(正如 find 等其他 file-handling 实用程序所具有的)。如果你告诉 grep 到 line-buffer 你点击这样的文件你最终会得到 corrupt fswatch 记录.

为什么不使用过滤器进行过滤?对于简单的过滤,它们很容易使用。这样 fswatch 将在内部匹配文件名,而您不必担心这些特性和 corner-cases.