2011-12-04 28 views
9

Gần đây tôi đã phát hiện gói sys.process ở Scala, và thích thú với sức mạnh của nó.Thực hiện các chuỗi bash bằng cách sử dụng scala.sys.process

Nhưng khi tôi cố gắng kết hợp nó với đường ống bash và backticks, tôi gặp khó khăn.

Điều này rõ ràng không hoạt động:

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

tôi cố gắng sử dụng bash thực thi để có được những hành vi mong muốn:

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

Tôi đang làm gì sai?

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

thông tin thêm ví dụ, nhưng tôi hy vọng bạn nhận ra bạn không cần bash ở tất cả cho điều này: 'Seq ("ngày") !! ' –

+0

@ ToddOwen - chắc chắn, đó chỉ là mục đích ví dụ. – Rogach

Trả lời

21

Bạn đang làm nhiều điều sai trái trên thực tế. Bạn nên sử dụng tùy chọn -c của bash và bạn nên sử dụng một Seq [String] với mỗi tham số để bash trong String riêng của nó, hoặc thư viện scala sẽ chỉ tách chuỗi tại mọi ký tự khoảng trắng. (Đây là lý do tại sao giải pháp Rex Kerr không hoạt động.)

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

Điểm tốt về phiên bản 'Seq'. Tôi thực sự sử dụng cái đó thay vào đó, vì tôi luôn làm thế, và không bao giờ kiểm tra phiên bản chuỗi đơn! –

+0

Dưới đây là một ví dụ khác thực hiện một kịch bản và với args để làm theo. IE: test.sh echo $ 1 scala> Seq ("/ somePath/test.sh", "HI")! tín dụng do đây: http://stackoverflow.com/questions/9039167/scala-system-process-and-whitespace – Nick

Các vấn đề liên quan