2011-12-04 8 views
9

Recentemente ho scoperto sys.process pacchetto a Scala, e si divertiva con il suo potere.Esecuzione stringhe bash utilizzando scala.sys.process

Ma quando cerco di combinare con tubi Bash e backticks, mi si blocca.

Questo ovviamente non funziona:

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

Ho cercato di usare l'eseguibile bash per ottenere il comportamento desiderato:

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

Che cosa sto facendo di sbagliato?

Edit:

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

esempio informativo, ma spero ti rendi conto che non è necessario bash a tutti per questo: 'Seq ("data") !!' –

+0

@ ToddOwen - certo, questo era solo a scopo di esempio. – Rogach

risposta

21

si sta facendo più cose sbagliate in realtà. Dovresti usare l'opzione -c di bash e dovresti usare una Seq [String] con ogni parametro per bash nella sua String, o la libreria di scala dividerà semplicemente la stringa in ogni carattere di spazio. (Questo è il motivo per cui la soluzione di Rex Kerr non funziona.)

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

Buon punto sulla versione 'Seq'. In realtà ho usato quello invece, dato che lo faccio sempre, e non ho mai controllato la versione a stringa singola! –

+0

Ecco un altro esempio di esecuzione di uno script e con argomenti da seguire. IE: test.sh echo $ 1 scala> Seq ("/ somePath/test.sh", "HI")! credito a causa di qui: http://stackoverflow.com/questions/9039167/scala-system-process-and-whitespace – Nick

Problemi correlati