2011-12-04 12 views
9

Recientemente descubrí el paquete sys.process en Scala, y me divertí por su potencia.Ejecutando bash strings usando scala.sys.process

Pero cuando intento combinarlo con bash pipes y backticks, me atasco.

Esto, obviamente, no funciona:

scala> "echo `date`" !! 
res0: String = " 
"`date` 
" 

He intentado utilizar el ejecutable bash para conseguir el comportamiento deseado:

scala> "bash -e echo `date`" !! 
/bin/echo: /bin/echo: cannot execute binary file 
java.lang.RuntimeException: Nonzero exit value: 126 

¿Qué estoy haciendo mal?

Editar:

scala> "bash -ic 'echo `date`'" !! 
`date`': unexpected EOF while looking for matching `'' 
`date`': syntax error: unexpected end of file 
java.lang.RuntimeException: Nonzero exit value: 1 
+0

ejemplo informativo, pero espero que te das cuenta de que no es necesario fiesta en absoluto para esto: 'Sec ("fecha") !!' –

+0

@ ToddOwen - claro, eso fue solo por ejemplo. – Rogach

Respuesta

21

que estás haciendo varias cosas mal en realidad. Debería usar la opción -c de bash y debería usar un Seq [String] con cada parámetro para bash en su propia cadena, o la biblioteca scala solo dividirá la cadena en cada carácter de espacio. (Esta es la razón por la solución de Rex Kerr no funciona.)

scala> import sys.process.stringSeqToProcess 
import sys.process.stringSeqToProcess 

scala> Seq("bash", "-c", "echo `date`")!! 
res20: String = 
"Sun Dec 4 16:40:04 CET 2011 
" 
+1

Buen punto sobre la versión 'Seq'. ¡De hecho usé ese, como siempre lo hago, y nunca revisé la versión de cadena única! –

+0

Aquí hay otro ejemplo ejecutando un script y con argumentos a seguir. IE: test.sh echo $ 1 scala> Seq ("/ somePath/test.sh", "HI")! crédito debido a aquí: http://stackoverflow.com/questions/9039167/scala-system-process-and-whitespace – Nick