【问题标题】:How to run fswatch to call a program with static arguments?如何运行 fswatch 来调用带有静态参数的程序?
【发布时间】:2014-10-30 15:01:52
【问题描述】:

我曾经像这样使用 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 脚本中的情况下做到这一点?

【问题讨论】:

    标签: macos bash watch fswatch


    【解决方案1】:

    fswatch 文档(Texinfo manual、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,集合中的记录数)传递给正在执行的命令。

    【讨论】:

    • 已将此标记为正确,因为它回答了我最初问题的关键 - 使用 xargs 而不将输出作为参数传递给要运行的命令。
    • 我认为“-o”选项应该与 fswatch 一起使用,而不是 xargs。
    【解决方案2】:

    与 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

    【讨论】:

    • 如果在 Bourne shell 中运行(可能发生在子进程调用中,具体取决于配置),read 命令将需要一个虚拟参数。
    • 不需要将管道的最后一部分包裹在括号中以制作子shell。
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多