代码之家  ›  专栏  ›  技术社区  ›  Mofis Khan

在groovy脚本上调用shell命令

  •  -1
  • Mofis Khan  · 技术社区  · 2 年前

    我试图在groovy脚本下面运行,并使用grep命令生成预期的结果。而不是打印结果。它填充整个curl输出,而不需要greping DOCTYPE

    def print(){
    def sout = new StringBuffer(), serr = new StringBuffer()
    
    def proc ='''curl --silent --request POST --header "content-type:application/json"       www.google.co.in | grep DOCTYPE'''.execute()
    
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(2000)
    println sout
    }
    
    print()
    

    我们在linux终端上获得的预期结果

     curl --silent --request POST --header "content-type:application/json" www.google.co.in | grep DOCTYPE
    

    有人能帮我解决这种情况吗?如何解决。

    结果应该是传递了一系列命令的条件之后的最终结果。

    0 回复  |  直到 2 年前
        1
  •  0
  •   tim_yates    2 年前

    你不能只是把管道化的bash命令扔到一个String中,然后抱着最好的希望,它就是不起作用(主要是因为管道等是由shell执行的,你不会使用它)

    你可以这样做:

    // A curl process
    def curl = ['curl', '--silent', '--request', 'POST', '--header', 'content-type:application/json', 'www.google.co.in'].execute()
    
    // A grep process
    def grep = ['grep', 'DOCTYPE'].execute()
    
    // Pipe the output of curl into grep and get the text
    (curl | grep).text
    

    要在纯Groovy中做到这一点,需要:

    def response = new URL('https://www.google.co.in').with {
        openConnection().with {
            setRequestProperty('Content-type', 'application/json')
            requestMethod = 'POST'
            doOutput = true
            if (responseCode > 400) {
                errorStream.text
            } else {
                inputStream.text
            }
        }
    }
    
    println response.readLines().findAll { it.contains('DOCTYPE') }
    

    但由于你在詹金斯,我不确定这是否可行