2010-10-14 3 views
21

Я пытаюсь выполнить следующую команду с помощью «EXEC» задачу Ant:Как использовать задачу Ant exec для запуска команд с каналами?

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». Какие-либо предложения?

+1

похоже, что это может стоить просто написать простую задачу муравья, чтобы выполнить это, вместо использования exec. – Chii

+2

Там уже есть такая задача, называемая 'resourcecount'. – JesperE

ответ

31

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

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

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

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

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

Спасибо Мартину, это решает проблему, с которой я столкнулся. Спасибо Аарону тоже. –

2

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

Привет Аарон - Он почти работает! Кажется, что он игнорирует каталог/foo/bar и просто подсчитывает количество файлов в текущем каталоге, в котором вы находитесь, в bash. –

+0

Попробуйте '/ bin/ls -1' (один, не i или L) и всегда используйте абсолютный путь. –

+0

'ls -l/foo/bar | wc -l' должен быть единственным аргументом в/bin/sh. – JesperE

5

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

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

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

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

+0

Спасибо за комментарий JesperE. Я рассмотрю ресурс и замените его текущее решение. Cheers –

+0

Другой ответ был ответом, который я искал, но +1 для обеспечения наилучшего ответа на исходный вопрос. – undefined

Смежные вопросы