【问题标题】:fswatch with grep not pipingfswatch 与 grep 不管道
【发布时间】:2017-01-25 08:52:49
【问题描述】:

每当我保存时,我想使用 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

【问题讨论】:

  • -0 是为NULL 分隔,official-page 说,使用fswatch -o path ?结果一样吗?
  • fswatch -o . | xargs -I {} echo {} {} 然后我每次保存时都会得到1 1 作为输出

标签: bash fswatch


【解决方案1】:

人 grep:

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

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

【讨论】:

  • 好主意;它似乎比原生的fswatch 选项(--include--exclude)几乎要好,虽然我真的不能肯定... +1
  • 正如我所解释的,这并不是“更好”,除非您确定 fswatch 将输出的所有文件名中包含的字符。假设你没有这种控制,你不应该轻率地行缓冲,否则你很可能会遇到过滤器和fswatch选项-0处理的所有问题。
【解决方案2】:

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

现在:如fswatch 文档中所述,文件名可以包含换行符。因此存在-0(就像find 等其他文件处理实用程序一样)。如果你告诉grep 到行缓冲区并且你点击了这样一个文件,你最终会得到一个损坏fswatch 记录。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2011-01-20
    • 2020-07-22
    相关资源
    最近更新 更多