我曾经像这样使用 fswatch v0.0.2 (在本例中是在文件更改时运行 django 测试套件)
$>fswatch . 'python manage.py test'
这个效果很好。
我想排除一些导致测试每次保存运行多次的文件(Sublime text 正在保存 .tmp 文件,我怀疑 .pyc 文件也导致了这种情况)
所以我升级了fswatch以启用-e模式。
但是 fswatch 的方式发生了变化,这给我带来了麻烦 - 它现在接受像这样的管道参数:
$>fswatch . | xargs -n1 program
我不知道如何将参数传递给这里的程序。例如这不起作用:
$>fswatch . | xargs -n1 python manage.py test
这个也不是:
$>fswatch . | xargs -n1 'python manage.py test'
如何在不将命令打包到 bash 脚本中的情况下执行此操作?
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
,记录数在集合中)被传递到正在执行的命令。
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
function run_on_save () {
fswatch -0 -o $1 | xargs -0 -n1 -I{} ${@:2}
}
它将第一个参数 (
$1
) 传递给 fswatch,并将其余参数 (${@:2}) 传递给 xargs。
要使用它,请执行run_on_save <path to watch> <command to run>
。
示例
myfile.txt
时打印“hello”:
run_on_save myfile.txt echo "hello"
。
run_on_save project_folder pytest .
欢迎改进。