0

这是在终端上运行得很好的命令

egrep Version ./path/fileName.java | cut -d"\"" -f4

我在我的代码中使用了以下内容

<exec command="egrep Version ./path/fileName.java | cut -d&quot;\&quot; -f4)" outputproperty="VER"/>

但是出现错误

the command attribute is deprecated.
 [exec] Please use the executable attribute and nested arg elements.
 [exec] Result: 1
 [echo] "Version: egrep: invalid argument `\\' for `--directories'
 [echo] Valid arguments are:
 [echo]   - `read'
 [echo]   - `recurse'
 [echo]   - `skip'
 [echo] Usage: egrep [OPTION]... PATTERN [FILE]...
 [echo] Try `egrep --help' for more information."   

少了一个quot; 在命令中,因为如果我写 2 个引号,它会给我的引号数不平衡错误。

4

2 回答 2

2

尝试'在您的 xml 中使用

<exec command='egrep Version ./path/fileName.java | cut -d"\"" -f4)' outputproperty="VER"/>
于 2013-11-08T21:07:42.057 回答
2

Ant<exec>使用 Java 的执行规则,特别是它不是一个 shell,它自己不理解管道和重定向。可能你最好的选择是调用一个 shell。如果您想稍后在构建中使用它,您还需要在属性中捕获输出:

<exec executable="sh" outputproperty="version.number">
  <arg value="-c" />
  <arg value="egrep Version ./path/fileName.java | cut -d'&quot;' -f4" />
</exec>

或者,您可以忘记 exec 并使用带有过滤器链的loadfile直接在 Ant 中实现所需的逻辑,而不是调用外部进程:

<loadfile srcFile="path/fileName.java" property="version.number"
          encoding="UTF-8">
  <filterchain>
    <tokenfilter>
      <!-- equivalent of egrep Version -->
      <containsregex pattern="Version" />
      <!-- equivalent of the cut - extract the bit between the third and
           fourth double quote marks -->
      <containsregex pattern='^[^"]*"[^"]*"[^"]*"([^"]*)".*$$'
                     replace="\1" />
    </tokenfilter>
    <!-- I'm guessing you don't want a trailing newline on your version num -->
    <striplinebreaks />
  </filterchain>
</loadfile>
于 2013-11-08T21:12:44.773 回答