1

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?

Nikki Koole
  • 136
  • 1
  • 8
  • Apparently `fswatch` continues to run, so the pipeline is not finished. The `&&` happens if and when the pipeline finishes. (The pipe to `make` is obviously just bogus; there is no useful output from `cp` which would make sense as standard input to `make`.) – tripleee Feb 04 '16 at 09:14
  • Another dirty hack would be: `fswatch ./src | xargs -I {} cp -v {} ./otherfolder | xargs -I {} make` – anishsane Feb 04 '16 at 09:40

1 Answers1

5

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.

Tom Fenech
  • 72,334
  • 12
  • 107
  • 141