Hackaholic
Hackaholic

Reputation: 19743

Scala ProcessLogger cant capture output

why its throwing error on screen instead of capturing in stderr?

scala> val stderr = new StringBuilder
stderr: StringBuilder =

scala> val stdout = new StringBuilder
stdout: StringBuilder =

scala> val k = Seq("ls /sdds") ! ProcessLogger(stdout append _, stderr append _)
java.io.IOException: Cannot run program "ls /sdds": error=2, No such file or directory
  at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
  at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
  at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:69)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:100)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder$$anonfun$runBuffered$1.apply(ProcessBuilderImpl.scala:148)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder$$anonfun$runBuffered$1.apply(ProcessBuilderImpl.scala:148)
  at scala.sys.process.ProcessLogger$$anon$1.buffer(ProcessLogger.scala:99)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.runBuffered(ProcessBuilderImpl.scala:148)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang(ProcessBuilderImpl.scala:114)
  ... 32 elided
Caused by: java.io.IOException: error=2, No such file or directory
  at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
  at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340)
  at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271)
  at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
  ... 40 more

scala> stderr.toString()
res26: String = ""

Upvotes: 0

Views: 282

Answers (1)

jwvh
jwvh

Reputation: 51271

The error you're seeing isn't captured in the stderr StringBuilder because it isn't coming from the launched process. The process isn't executing because the command isn't being parsed correctly.

Try either "ls /sdds" ! or Seq("ls", "/sdds") ! and see if that works.

val pl = ProcessLogger(stdout append _, stderr append _)
val k = "ls /sdds" ! pl

I had to separate the ProcessLogger creation from the ProcessBuilder but that just might have been the worksheet environment I'm working in.

Upvotes: 3

Related Questions