跳到主要内容

watchman-wait

watchman-wait 等待文件更改。它使用 watchman 服务来高效地递归监视您指定的路径列表。

它适用于从 shell 脚本等待文件更改。它与 inotifywait 有些相似,不同之处在于它使用 watchman 服务来监视文件,因此可以在 watchman 支持的任何操作系统上使用,而不仅仅是 Linux。

它可以在观察到可配置数量的事件后停止。 默认值为单个事件。 您也可以删除限制并允许其连续执行。

watchman-wait 将每行打印一个事件。 事件信息包括您指定的字段列表,每个字段用空格(或您选择的 --separator)分隔。

事件在分派到 watchman-wait 之前由 watchman 服务器合并和确认,以便您的脚本在文件停止更改后才开始执行。

watchman-wait 需要 pywatchman(因此需要 python)以及 watchman

路径和模式

$ watchman-wait path [path ...]

监视的主要单元是路径。 您必须指定一个或多个您要等待的路径的列表。 路径可以是文件或目录。 您列表中的每个路径都必须在您调用 watchman-wait 时存在,否则将报告错误,并且 watchman-wait 将退出。

如果您想等待文件被创建,您可以监视它将被创建的目录。 您可以通过将其限制为一组模式来进一步优化您的监视。

$ watchman-wait . -p '*.so'
$ watchman-wait -p '*.so' -- .

以上两者都将等待当前工作目录下的任何路径中的共享对象文件被更改。 由于 -p 选项和路径列表都接受一个或多个参数,因此第二种形式显示了如何使用 -- 分隔符来区分模式列表和路径列表。

模式是 wildmatch 样式的 glob,支持通过 ** 占位符进行递归匹配。

您应该始终引用您的模式参数,以便它们不会被您的 shell 评估。

控制生命周期

watchman-wait 运行时间长短主要有两种控制方式

  • -t--timeout 对执行设置时间限制
  • -m--max-events 限制要处理的事件数量

当达到超时或达到最大事件限制时,watchman-wait 将终止。

默认情况下没有时间限制,但有一个默认限制,即单个事件。

您可以指定 --max-events 0 以禁用事件限制。

控制输出

watchman-wait 将为每个事件输出一行。 以下选项会影响输出

  • --fields NAME,NAME - 指定要为每个事件打印的字段列表。 默认值为 --fields name,它只会打印已更改文件的 name。 您可以使用可用字段中列出的任何可用字段。 字段将按照您列出的顺序打印。
  • --relative DIR - 在打印之前,name 字段将被调整为相对于 DIRDIR 的默认值是 watchman-wait 启动时的当前工作目录。
  • --separator STRING - 如果您指定了多个字段,则在打印它们时将使用分隔符字符串。 默认值为 --separator " ",它将打印字段,字段之间用空格分隔。

退出状态

可以使用以下退出状态代码来确定导致 watchman-wait 退出的原因

  • 成功等待事件后返回 0
  • 如果发生某种运行时错误,则返回 1
  • 使用了 -t/--timeout 选项,并且在收到事件之前经过了该时间量,则返回 2
  • 如果执行被中断(Ctrl-C),则返回 3