Как использовать задачу Ant exec для запуска команд по конвейеру? - PullRequest
21 голосов
/ 14 октября 2010

Я пытаюсь запустить следующую команду, используя задачу 'exec' в Ant:

ls -l /foo/bar | wc -l

В настоящее время мой исполнительный директор выглядит так:

<exec executable="ls" outputproperty="noOfFiles">
    <arg value="-l" />
    <arg value="/foo/bar" />
    <arg value="|" />
    <arg value="wc" />
    <arg value="-l" />
</exec>

Команда 'ls', похоже, работает, но ей сложно передать вывод в 'wc' Есть предложения?

Ответы [ 3 ]

32 голосов
/ 14 октября 2010

Если вы используете sh -c, как предлагает Аарон, вы можете передать весь конвейер как один аргумент, эффективно выполняя:

sh -c "ls -l foo/bar | wc -l"

Если вы используете отдельные аргументы, они потребляются sh, а не передаютсядо ls (следовательно, вы видите только текущий каталог).

Обратите внимание, что в моей системе ls -l включает в себя как общее количество, так и список найденных файлов, что означает, что показанное число на единицу больше, чемколичество файлов.Так что советую:

<exec executable="sh" outputproperty="noOfFiles">
    <arg value="-c" />
    <arg value="ls foo/bar | wc -l" />
</exec>
5 голосов
/ 10 декабря 2010

Если вы просто хотите считать файлы в каталоге, вообще не используйте внешнюю оболочку.Используйте задачу resourcecount.Быстрый, компактный, переносимый и простой для чтения:

<resourcecount property="numfiles">
  <fileset dir="."/>
</resourcecount>

И, конечно, вы можете настроить fileset так, чтобы он просто включал нужные вам файлы.

(На самом деле оченьнесколько случаев, когда вам нужно порождать внешнюю оболочку. Встроенные перенаправители ввода / вывода Ant и цепочки фильтров ввода / вывода могут часто выполнять то же самое в переносном режиме, даже если это иногда немного многословно.)

2 голосов
/ 14 октября 2010

Вам нужен кто-то, чтобы распознать и построить трубу. Попробуйте sh:

<exec executable="sh" outputproperty="noOfFiles">
    <arg value="-c" />
    <arg value="ls" />
    <arg value="-l" />
    <arg value="/foo/bar" />
    <arg value="|" />
    <arg value="wc" />
    <arg value="-l" />
</exec>
...