【问题标题】:Ant @ variable not resolvedAnt @ 变量未解析
【发布时间】:2015-08-25 02:41:23
【问题描述】:

这是我的 build.xml 的 sn-p

<target name="compile">
  <for param="rsync.destination.host" list="${file}" delimiter="${line.separator}">
    <sequential>
    <echo message="${rsync.ssh.user}@@{rsync.destination.host}:${rsync.destination.base.dir}/"/>
    </sequential>
  </for>
</target>

我收到以下输出,

compile:
     [echo] root@{rsync.destination.host}:/tmp/
     [echo] root@{rsync.destination.host}:/tmp/

BUILD SUCCESSFUL
Total time: 0 seconds

所以这里@{rsync.destination.host} 变量因为双@@ 字符而没有被解释。如果我在它们之间放置空间

    <echo message="${rsync.ssh.user}@ @{rsync.destination.host}:${rsync.destination.base.dir}/"/>

然后变量按预期解析。

compile:
     [echo] root@ server1:/tmp/
     [echo] root@ server2:/tmp/

BUILD SUCCESSFUL
Total time: 0 seconds

由于用户名和服务器中有空格,如果我们在这里执行 ssh 会出现异常。知道如何解决这个问题。

【问题讨论】:

    标签: ant ant-contrib


    【解决方案1】:

    (核心)ant 中没有变量,只有属性和属性。 @{foo} 是访问宏定义中的宏定义属性值的语法。由于antcontrib for task 在底层使用ant macrodef task,它具有相同的语法。
    尝试:

    ...
    <echo message="${rsync.ssh.user}@@@{rsync.destination.host}:${rsync.destination.base.dir}/"/>
    ...
    

    表示使用 3x @ 而不是 2x @
    参数@{rsync.destination.host} 必须用第二个@ 屏蔽,所以实际上你需要使用@ 3 次。

    【讨论】:

    • 感谢您的解决方案,但在这里如果是 4x@,我只需要 3x@。请您编辑您的答案,以便我将其标记为已接受。
    【解决方案2】:

    您可以将文字 at-sign 放入属性中:

    <property name="at" value="@"/>
    <echo message="${rsync.ssh.user}${at}@{rsync.destination.host}:${rsync.destination.base.dir}/"/>
    

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多