代码之家  ›  专栏  ›  技术社区  ›  Alexander Stohr

如何使用grovy脚本控制台(jenkins)中的bash向python发送单个管道命令?

  •  0
  • Alexander Stohr  · 技术社区  · 5 年前

    我使用的是Jenkins提供的groovy脚本控制台。 我有一个很好的工作线为詹金斯奴隶(基于Windows):

    println "cmd /c echo print(\"this is a sample text.\") | python".execute().text
    

    现在我想要一个Jenkins slave(基于Linux)的功能等价物。 所以我从Linux命令行开始,让这个核心命令为我工作:

    bash -c 'echo print\(\"this is a sample text.\"\) | python'
    

    然后,我将所有这些控制台命令行封装到一个更多的转义代码和调用修饰中——但是通过这个,它进入了一个不再正常工作的状态:

    println "bash -c \'echo print\\(\\\"this is a sample text.\\\"\\) | python\'".execute().txt
    

    运行时的结果如下:

    空的

    我觉得我现在被困在了,因为我没能解决影响逃逸角色等级的众多问题。 怎么了?如何解决?(也许:为什么?)

    附言:如果不清楚的话-我想(如果可能的话)像最初的物品一样贴在一个衬垫上。

    0 回复  |  直到 5 年前
        1
  •  1
  •   thehole    5 年前

    如果你不需要用管道把bash导入python,也许这适合你的喜好?

    ['python','-c','print("this is a sample text")'].execute().text
    

    如果你 需要它,试试看

    ['bash','-c', /echo print\(\"this is a sample text.\"\) | python/].execute().text
    

    使用 List .execute() 有助于澄清每个论点是什么。斜杠字符串通过更改转义符来帮助实现。

        2
  •  1
  •   Anubis    5 年前
    print "bash -c 'echo \"print(\\\"this is a sample text.\\\")\" | python'"
    

    输出:

    bash -c 'echo "print(\"this is a sample text.\")" | python'
    
        3
  •  0
  •   Alexander Stohr    5 年前

    在深入研究之后,我发现了一个与平台无关、支持错误通道(stderr)和执行故障的解决方案,它甚至可以避免操作系统特定的组件,如bash/cmd.exe:

    try {
      def command = ['python', '-c', /print("this is a sample text.")/];
      if (System.properties['os.name'].toLowerCase().contains('windows'))
      {
        command[2] = command[2].replaceAll(/\"/, /\\\"/)
      }
      println "command=" + command
      def proc = command.execute()
      def rc = proc.waitFor()
      println "rc=" + rc
    
      def err = proc.err.text
      if( err != "" ) { print "stderr=" + err }
    
      def out = proc.text
      if( out != "" ) { print "stdout=" + out }
    } catch(Exception e) {
      println "exception=" + e
    }
    println ""