简体   繁体   中英

How to send a single pipelined command to python using bash from a groovy script console (Jenkins)?

I am using the groovy script console as offered by Jenkins. I have this nicely working line for a Jenkins slave (Windows based):

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

Now i want the functional equivalent for a Jenkins slave (Linux based). So i started on the Linux command line and got this core command working for me:

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

Then i wrapped all of this console command line into a some more escape codes and invocation decoration - but by this it went to a no longer functional state:

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

The result when running it is just this:

empty

I feel i am stuck at the moment due failing to solve the multitude of effecting escape character levels. Whats wrong? How to solve it? (And maybe: why?)

PS: if unclear - i want (if possible at all) to stick to an one-liner as the initial item was.

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

Output:

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

If you don't need to pipe bash into python, maybe this suits your fancy?

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

If you do need it, try

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

Using List 's .execute() helps with clarifying what each argument is. The slashy-strings help by changing the escape-character.

After digging around for some more while i found a somewhat platform-independent, error channel (stderr) aware and execution fault capable solution that even avoids OS specific components like 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 ""

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM