如何使用Ant exec任务运行管道命令?

时间:2010-10-14 08:59:16

标签: shell ant pipe

我正在尝试使用Ant中的'exec'任务运行以下命令:

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 个答案:

答案 0 :(得分:31)

如果您使用sh -c作为Aaron建议,您可以将整个管道作为单个arg传递,有效地执行:

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

如果你使用单独的args,它们会被sh使用,而不是传递给ls(因此你只看到当前目录)。

请注意,在我的系统上,ls -l包含所有文件的总数和列表,这意味着显示的数量比文件数多一个。所以建议:

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

答案 1 :(得分:5)

如果您只想计算目录中的文件,请不要使用外部shell。使用resourcecount任务。快速,紧凑,便携且易于阅读:

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

您当然可以自定义fileset以包含您需要的特定文件。

(实际上很少需要产生外部shell.Ant内置的I / O重定向器和输入/输出过滤器链通常可以以可移植的方式完成同样的事情,即使它有时是一点点冗长。)

答案 2 :(得分: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>