带有 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.
我想在每次保存时通过我的单元测试框架使用 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.