【问题标题】:Running a command after a command that used xargs and fswatch在使用 xargs 和 fswatch 的命令之后运行命令
【发布时间】:2016-02-04 09:03:28
【问题描述】:

您好,我正在尝试编写一个 shell 命令:

  1. 查看文件夹
  2. 当文件更改时,将新文件复制到某处
  3. 然后运行 ​​make 任务

fswatch ./src | xargs -I {} cp {} ./otherfolder

前两件事可以使用上面的命令,但我不知道如何在此之后运行命令。

我试过了

fswatch ./src | xargs -I {} cp {} ./otherfolder && make

这不起作用,因为我认为 && 与 xargs 冲突

fswatch ./src | xargs -I {} cp {} ./otherfolder | make

这里立即调用 make 命令,而不是在复制完成之后。 (它甚至在 fswatch 触发更改之前调用)

是否可以在 cp 之后使用 xargs 运行命令?

【问题讨论】:

  • 显然fswatch 继续运行,所以管道没有完成。 && 在管道完成时发生。 (make 的管道显然只是假的;cp 没有有用的输出作为make 的标准输入是有意义的。)
  • 另一个肮脏的黑客是:fswatch ./src | xargs -I {} cp -v {} ./otherfolder | xargs -I {} make

标签: linux bash xargs fswatch


【解决方案1】:

解决问题的一种方法是生成一个 shell:

fswatch  ./src | xargs -I {} sh -c "cp '{}' ./otherfolder && make"

双引号的内容在单独的 shell 中执行,并且会按照您的预期运行(首先复制,然后执行 make,假设复制成功)。

建议{} 周围的单引号防止当文件名包含空格或其他字符(如*)时出现问题,否则会被shell 扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2011-11-20
    • 2022-12-09
    相关资源
    最近更新 更多