从 Ant 调用 Ruby 时,如何解决 `$(' is not allowed as a global variable name

How do I solve `$(' is not allowed as a global variable name when invoking Ruby from Ant

我需要在远程 Mac 机器上安装 Homebrew,并且由于一些设计决定,我可以 运行 在那台机器上做任何事情的唯一方法是执行 Ant 脚本。

我正在尝试调整 instructions from the Homebrew website 和 运行 等同于此:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

...来自 Ant 构建文件。这是:

<project name="default" default="homebrew">
    <target name="ruby" >
        <echo message="Checking Ruby..." />
        <exec executable="/usr/bin/ruby">
            <arg value="--version"/>
        </exec>
        <echo message="Checking Ruby done!" />
    </target>
    <target name="homebrew" depends="ruby">
        <echo message="Installing Homebrew..." />
        <exec executable="/usr/bin/ruby">
            <arg line=' -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"'/>
        </exec>
        <echo message="Homebrew installation done!" />
    </target>
</project>

这是我得到的:

ruby:
     [echo] Checking Ruby...
     [exec] ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin16]
     [echo] Checking Ruby done!

homebrew:
     [echo] Installing Homebrew...
     [exec] -e:1: `$(' is not allowed as a global variable name
     [exec] Result: 1
     [echo] Homebrew installation done!

如何解决这个 $(' is not allowed as a global variable name 问题?是否有可能以某种方式逃避 $ 标志? 简而言之,我如何调整这个 Ant 构建文件来安装 Homebrew?我可以将 Homebrew 安装命令放在 bash 脚本中,但我更愿意直接从 Ant 修复语法。

Ant 的 exec 任务经常因复杂的命令行操作而阻塞。一般来说,最好坚持使用多个 exec 步骤,包含一系列单独的 arg value 而不是完整的 arg line

试试这个:

<target name="ruby">
    <echo message="Checking Ruby..." />

    <exec executable="/usr/bin/ruby">
        <arg value="--version"/>
    </exec>

    <echo message="Checking Ruby done!" />
</target>

<target name="homebrew" depends="ruby">
    <echo message="Installing Homebrew..." />

    <exec executable="curl" outputproperty="homebrew.install">
        <arg value="-fsSL" />
        <arg value="https://raw.githubusercontent.com/Homebrew/install/master/install" />
    </exec>

    <exec executable="/usr/bin/ruby" failonerror="true">
        <arg value="-e"/>
        <arg value="${homebrew.install}"/>
    </exec>

    <echo message="Homebrew installation done!" />
</target>

此处远程安装脚本首先被卷曲并存储为 Ant 属性 使用 execoutputproperty 属性,然后作为参数传递给 ruby.

(请注意,我还在安装步骤中添加了 failonerror="true",但这只是我的一个用例假设。如果需要,可以将其删除。)