Как использовать задачу 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. Любые предложения?
Ответы
Ответ 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>