Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Gradle脚本运行shell命令_Shell_Gradle - Fatal编程技术网

从Gradle脚本运行shell命令

从Gradle脚本运行shell命令,shell,gradle,Shell,Gradle,我正在花最宝贵的时间试图弄清楚如何从Gradle运行shell命令,因为Gradle似乎很难做到这一点 命令如下: git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D 这只是一个方便的命令,用于清理已合并的本地分支 以下是我创建的任务: task gitCleanLocalBranches { doLast { ex

我正在花最宝贵的时间试图弄清楚如何从Gradle运行shell命令,因为Gradle似乎很难做到这一点

命令如下:

git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D
这只是一个方便的命令,用于清理已合并的本地分支

以下是我创建的任务:

task gitCleanLocalBranches {
    doLast {
        exec {
            workingDir '.'
            commandLine 'git branch --merged | grep -v \\* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D'

        }
    }
}
任务失败,原因是:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':gitCleanLocalBranches'.
> A problem occurred starting process 'command 'git branch -a''

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':gitCleanLocalBranches'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        ...
Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D''
        at org.gradle.process.internal.DefaultExecHandle.execExceptionFor(DefaultExecHandle.java:222)
        ... 3 more
Caused by: net.rubygrapefruit.platform.NativeException: Could not start 'git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D'
        at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:27)
        ... 4 more
Caused by: java.io.IOException: Cannot run program "git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D" (in directory "/home/wlaw/sterlib"): error=2, No such file or directory
        at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25)
        ... 6 more
Caused by: java.io.IOException: error=2, No such file or directory
        ... 7 more
所以我认为命令太复杂了,所以我尝试了更简单的方法,并将
commandLine
更改为:

commandLine 'git branch -a'

但我得到了完全相同的错误。为什么Gradle无法在
路径
环境变量中找到任何内容?

要执行的命令及其参数必须是单独的参数才能传递给
命令行
,如下所示:

commandLine 'git', 'branch', '-a'
如果要执行第一个示例中的复杂管道, 您可以将其包装在shell脚本中

我无法测试这一点,但我认为这也应该有效:

commandLine 'sh', '-c', 'git branch --merged | grep -v -e \* -e master -e develop -e dmz | xargs git branch -D'
注意:我冒昧地简化了
grep


最后,您还可以在
.gitconfig
中创建Git别名来包装复杂的管道。

如果需要保存命令输出,可以执行以下操作:

def gitBranchA = "git branch -a".execute().text.trim()

首先,这肯定是令人讨厌的,因此看起来不必要地复杂,特别是对于具有多个参数的单个命令。但是关于你的第二点,这是我不希望做的事情,因为这实际上只是一行代码,创建一个全新的文件似乎可以避免Gradle的问题,即不能从build中运行shell命令。Gradle.re:只运行shell命令。在Unix中,管道用于分隔多个命令。如果您愿意,您可以将其称为一行,但它仍然表示多个命令。@wheeler我在我的答案中又添加了两个可能适合您的选项。