在gradleexec任务中使用bash glob

在gradleexec任务中使用bash glob,bash,gradle,glob,Bash,Gradle,Glob,我正在构建一个gradleExec任务,它意味着只调用一个基本的sed命令,比如说:sed-I's:some:substitution:'* 什么是正确的语法或gradle函数/变量,以使*glob替换为在某些bash/zsh shell中匹配的文件 换句话说,如何触发外壳扩展 到目前为止,我尝试的是: task myTask(type: Exec){ workingDirsome dir commandLine 'sed', '-i', 's:some:substitut

我正在构建一个gradle
Exec
任务,它意味着只调用一个基本的
sed
命令,比如说:
sed-I's:some:substitution:'*

什么是正确的语法或gradle函数/变量,以使
*
glob替换为在某些bash/zsh shell中匹配的文件

换句话说,如何触发外壳扩展


到目前为止,我尝试的是:

task myTask(type: Exec){

    workingDirsome dir

    commandLine 'sed', '-i', 's:some:substitution:', "*"
}

但是我得到一个错误:
sed:cannotread*:没有这样的文件或目录
,这并不奇怪。

您需要启动包装在shell中的命令:

commandLine 'bash', '-c', 'sed -i "s:some:substitution:" *'

这里有一个改进,它只在文件确实存在的情况下运行
sed
。它需要bash

commandLine 'bash', '-c', 'shopt -s nullglob; f=(*); [[ ${f#[@]} -gt 0 ]] && sed -i "s:some:substitution:" -- "${f[@]}"'

当然,在许多系统中,
/bin/sh
是指向
/bin/bash
的链接。工作得很好:)。(使用
sh
,因此使用
bash
)它看起来可能更稳定,但仍然容易出现竞争条件<代码>如果存在文件(文件),则读取文件将始终倾向于竞争conditions@hek2mgl它只检查一次。与
*
一样,
“${f[@]}”
立即展开。所以,如果你考虑这里的比赛条件,那么你应该考虑比赛条件的<代码> */COD>。是的,我考虑比赛条件与我的代码。我只是想指出,你可以省略额外的检查,因为它仍然容易受到比赛条件的影响。我们唯一能做的就是:这样做,检查错误,如果有错误就处理。