0

出于某种原因,从 groovy 运行 curl 会成功调用错误:

def command = ["curl", "-LO", "https://curl.se/download/curl-7.79.1.tar.gz"]
def process = command.execute()
StringWriter output = new StringWriter()
StringWriter error = new StringWriter()
process.waitForProcessOutput(output, error)
if(process.exitValue()) {
  throw new Exception("$error")
}

println "EXIT CODE: ${process.exitValue()}"
println "OUT: $output"
println "-------------------------------------------"
println "ERROR: $error"
println output.toString()

运行上述给出:

EXIT CODE: 0
OUT: 
-------------------------------------------
ERROR:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 4047k  100 4047k    0     0  7266k      0 --:--:-- --:--:-- --:--:-- 7266k

为什么 groovyerror即使outexitValue=0

?

4

1 回答 1

0

curl 的基本行为(在没有任何选项的终端中使用时)是将数据输出到标准输出。

如果您阅读有关进度表的 curl 手册,您就会了解在这种情况下通常不会显示进度表https://curl.se/docs/manpage.html

为了显示进度表,您要么必须使用选项(就像您所做的那样)将输出重定向到文件,或者直接将 shell 中的标准输出重定向到文件(curl https://... > myfile)或管道。

在这种情况下,curl 检测到标准输出是管道或文件(而不是终端),并将自动启用标准错误上的进度表,使其不与输出混合。

我认为这就是您的情况,进程创建创建了两个管道来获取标准输出和错误,因此 curl 实现可能会将进度表切换到标准错误,因为它检测到标准输出是一个管道,即使您使用了-O选项_

编辑:经过一番调查后,我认为进度表总是发送到标准错误,即使您在终端中使用 -O 选项而没有对标准输出进行任何管道或文件重定向,它只是以这种方式编码以保持进度表的一致性(启用时)总是发送到标准错误

于 2021-09-25T10:15:47.293 回答