19

我曾经像这样使用 fswatch v0.0.2(在这种情况下,当文件更改时运行 django 测试套件)

$>fswatch . 'python manage.py test'

这很好用。

我想排除一些导致测试在每次保存时运行多次的文件(Sublime 文本正在保存一个 .tmp 文件,我怀疑 .pyc 文件也导致了这种情况)

所以我升级了 fswatch 以启用 -e 模式。

然而 fswatch 的方式发生了变化,这给我带来了麻烦——它现在接受一个管道参数,如下所示:

$>fswatch . | xargs -n1 program

我不知道如何在这里将参数传递给程序。例如,这不起作用:

$>fswatch . | xargs -n1 python manage.py test

这也不是:

$>fswatch . | xargs -n1 'python manage.py test'

如果不将我的命令打包到 bash 脚本中,我怎么能做到这一点?

4

2 回答 2

24

fswatch文档(Texinfo 手册,或wiki,或README)有如何做到这一点的例子:

$ fswatch [opts] -0 -o path ... | xargs -0 -n1 -I{} your full command goes here

陷阱:

  • xargs -0, fswatch -0: 使用它来确保正确解释带有换行符的路径。
  • fswatch -o:使用它可以fswatch将集合中的所有事件“冒泡”成一个事件,仅打印集合中的记录数。
  • -I{}:指定占位符是您在不希望将记录(在这种情况下,因为使用了集合中的记录数)传递给命令的xargs情况下正确解释命令参数而错过的技巧执行。-o
于 2014-09-08T10:03:42.300 回答
24

替代答案不与 xargs 的默认存在原因作斗争 - 将输出作为参数传递给要运行的命令。

fswatch . | (while read; do python manage.py test; done)

这仍然有点罗嗦/语法,所以我创建了一个超级简单的 bash 脚本fswatch-do,它为我简化了事情:

#!/bin/bash  
(while read; do "$@"; done)

用法:

fswatch -r -o -e 'pyc' somepath | fswatch-do python manage.py test someapp.SomeAppTestCase

于 2014-09-08T10:47:11.447 回答