Подтвердить что ты не робот

Как использовать задачу Ant exec для запуска команд с каналами?

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

ls -l /foo/bar | wc -l

В настоящее время мой exec выглядит следующим образом:

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

Команда 'ls' выглядит как работающая, но ей трудно переносить вывод на wc. Любые предложения?

4b9b3361

Ответ 1

Если вы используете 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>

Ответ 2

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

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

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

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

Ответ 3

Вам нужно, чтобы кто-то узнал и построил трубу. Попробуйте 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>