Gradle Exec任务无法运行sed

时间:2015-08-20 04:17:21

标签: shell sed gradle

我的构建脚本具有以下任务

task editProjectArtificat (type:Exec) {
executable "sed"
args  "-e '/myInsertionMatchingPattern/r " + projectDir.toString() + "/scripts/install/myTextFileToInsert' < " + projectDir.toString() + "/build/scripts/MyOriginalInputFile > " + projectDir.toString() + "/build/scripts/MyChangedOutputFile"

}

使用此错误消息执行上述任务时,

gradle build失败

  sed:1:&#34; &#39; / myInsertionPattern / r ...&#34;:无效的命令代码

失败:构建因异常而失败。

  • 出了什么问题: 任务&#39;:MyProject:editProjectArtificat&#39;执行失败。
      

    处理&#39;命令&#39;&#39;&#39;完成非零退出值1

但是,当我更改gradle.build脚本以使任务看起来像这样

task editProjectArtificat (type:Exec) {
executable "sed"
args  "-e /myInsertionMatchingPattern/r " + projectDir.toString() + "/scripts/install/myTextFileToInsert < " + projectDir.toString() + "/build/scripts/MyOriginalInputFile > " + projectDir.toString() + "/build/scripts/MyChangedOutputFile"

}

现在,这两个&#34;&#39;&#34;删除了&#34; arg&#34;一行,我们不再得到gradle构建错误;但是,sed不会产生&#34; MyChangedOutputFile&#34; gradle构建完成后按预期文件。

使用&#34;&#39;&#34;键入sed命令在shell上产生预期的输出?当&#34;&#39;&#34;&#34;&#34;&#34;&#34;&#34;在shell上删除。我理解sed需要&#34;&#39;&#34;围绕匹配的模式和命令。

1 个答案:

答案 0 :(得分:1)

我不知道gradle,但似乎args需要一个列表,每个参数都是分开的。但是,您正在使用重定向(&lt;和&gt;)并且必须由shell完成,因此您不应该执行sed而是执行bash。你想要像bash -c "sed -e '/.../r ...' <... >..."这样的东西,所以这样的东西可能会起作用:

task editProjectArtificat (type:Exec) {
 executable "bash"
 args  "-c", "sed -e '/myInsertionMatchingPattern/r " + projectDir.toString() + "/scripts/install/myTextFileToInsert' < " + projectDir.toString() + "/build/scripts/MyOriginalInputFile > " + projectDir.toString() + "/build/scripts/MyChangedOutputFile"
}