linuxbashxargsfswatch

Running a command after a command that used xargs and fswatch


Hi I am trying to write a shell command that does:

  1. watch a folder
  2. when a file has changed copy that new file somewhere
  3. then runs a make task

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

the first 2 things are working with the command above, but I cannot figure out how to run a command after this.

I've tried

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

That doesn't work because the && are conflicting with xargs I think

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

Here the make command is immediately called, not after the copying is done. (It's even called before fswatch triggers on a change)

Is it possible to run a command after the cp using xargs?


Solution

  • One way to solve the problem would be to spawn a shell:

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

    The contents of the double quotes are executed in a separate shell and will behave as you expect (first the copy, then the execution of make, assuming the copy was successful).

    The single quotes around {} are advised to guard against problems when the filename contains spaces or other characters such as * which would otherwise be expanded by the shell.