Как запустить fswatch для вызова программы со статическими аргументами?

Я использовал fswatch v0.0.2 так (в этом случае для запуска тестового костюма django при изменении файла)

$>fswatch . 'python manage.py test'

это прекрасно работает.

Я хотел исключить некоторые файлы, из-за которых тест запускался более одного раза для сохранения (Sublime text сохранял файл .tmp, и я подозреваю, что файлы .pyc также вызывают это)

Итак, я обновил fswatch, чтобы включить режим -e.

Однако способ fswatch изменился, что вызывает у меня проблемы - теперь он принимает аргумент pipe следующим образом:

$>fswatch . | xargs -n1 program

Я не могу понять, как передать аргументы в программу здесь. например это не работает:

$>fswatch . | xargs -n1 python manage.py test

и не делает этого:

$>fswatch . | xargs -n1 'python manage.py test'

как я могу это сделать без упаковки моей команды в bash script?

Ответ 1

fswatch (либо руководство Texinfo, либо wiki или README) приведены примеры того, как это делается:

$ fswatch [opts] -0 path ... | xargs -0 -n1 -I{} your full command goes here

Ловушки:

  • -0: используйте его, чтобы убедиться, что пути с символами новой строки интерпретируются правильно.
  • -o: используйте для него fswatch "пузырь" всех событий в наборе в один, который печатает только количество записей в наборе.
  • -I{}: указать местозаполнитель - это трюк, который вы пропустили для xargs правильно интерпретируете свои аргументы команды в тех случаях, когда вы не хотите записи (в этом случае, поскольку -o было использовано, количество записей в наборе), которые будут переданы в исполняемую команду.

Ответ 2

Альтернативный ответ, а не борьба с аргументом по умолчанию для xargs - передача на выходе в качестве аргументов команды, которую нужно запустить.

fswatch . | (while read; do python manage.py test; done)

Это еще немного словесный/синтаксис, поэтому я создал супер простой bash script fswatch-do, который упрощает для меня вещи:

#!/bin/bash  
(while read; do [email protected]; done)

использование:

fswatch -r -o -e 'pyc' somepath | fswatch-do python manage.py test someapp.SomeAppTestCase