scala - 在 scala 中运行控制台命令

标签 scala

我想在 Scala 中运行这个命令,尽管我遇到了各种各样的错误:

sed -i '.back' 's/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g' /Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf

sed -i '.back' "s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g" /Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf

我在这里列出了我所有的尝试(没有一个有效)。运行此命令的正确方法是什么?

尝试 1:

scala> val command = "sed -i '.back' 's/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g' /Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf"
scala> command.! 
sed: 1: "'s/maxTablesPerQuestion ...": invalid command code '
res25: Int = 1

尝试2:使用双引号:

scala> val command = "sed -i '.back' \"s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g\" /Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf"
scala> command.! 
sed: 1: ""s/maxTablesPerQuestion ...": invalid command code "
res26: Int = 1

尝试 3:使用 Seq:

scala> val command = Seq("sed -i '.back' \"s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g\" /Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf")
scala> command.! 
java.io.IOException: Cannot run program "sed -i '.back' "s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g" /Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf": error=2, No such file or directory
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
  at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:69)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:98)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang(ProcessBuilderImpl.scala:112)
  ... 33 elided
Caused by: java.io.IOException: error=2, No such file or directory
  at java.lang.UNIXProcess.forkAndExec(Native Method)
  at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
  at java.lang.ProcessImpl.start(ProcessImpl.java:134)
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
  ... 36 more

尝试 4:使用 Seq:

scala> val command = Seq("sed -i '.back' \"s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g\"", "/Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf")

scala> command.!
java.io.IOException: Cannot run program "sed -i '.back' "s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g"": error=2, No such file or directory
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
  at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:69)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:98)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang(ProcessBuilderImpl.scala:112)
  ... 33 elided
Caused by: java.io.IOException: error=2, No such file or directory
  at java.lang.UNIXProcess.forkAndExec(Native Method)
  at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
  at java.lang.ProcessImpl.start(ProcessImpl.java:134)
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
  ... 36 more

尝试 5:使用 Seq:

scala> val command = Seq("sed -i '.back'", "\"s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g\"", "/Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf")

scala> command.!
java.io.IOException: Cannot run program "sed -i '.back'": error=2, No such file or directory
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
  at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:69)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:98)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang(ProcessBuilderImpl.scala:112)
  ... 33 elided
Caused by: java.io.IOException: error=2, No such file or directory
  at java.lang.UNIXProcess.forkAndExec(Native Method)
  at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
  at java.lang.ProcessImpl.start(ProcessImpl.java:134)
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
  ... 36 more

尝试 6:

scala> val command = Seq("sed -i", "'.back'", "\"s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g\"", "/Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf")

scala> command.!
java.io.IOException: Cannot run program "sed -i": error=2, No such file or directory
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
  at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:69)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:98)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang(ProcessBuilderImpl.scala:112)
  ... 33 elided
Caused by: java.io.IOException: error=2, No such file or directory
  at java.lang.UNIXProcess.forkAndExec(Native Method)
  at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
  at java.lang.ProcessImpl.start(ProcessImpl.java:134)
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
  ... 36 more

尝试 7:使用 Seq:

scala> val command = Seq("sed", "-i", "'.back'", "\"s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g\"", "/Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf")

scala> command.!
sed: 1: ""s/maxTablesPerQuestion ...": invalid command code "
res34: Int = 1

最佳答案

在 Scala 中执行系统命令的最佳方法是使用“序列语法”(参见代码)。带有转义字符的长字符串要正确处理要麻烦得多。使用这种语法时我几乎从未遇到过任何问题。

需要注意的一件事是,您不再需要使用单引号 ' 或双引号 " 来定义命令段。该序列已经给出了所有sed(或任何其他命令)所需的详细信息。

尝试一下,如果它不能完全满足您的需要,请告诉我。

import sys.process._

Seq("sed","-i",".back","s/maxTablesPerQuestion/maxTablesPerQuestion = 2.0 /g", "/Users/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application.conf").!

关于scala - 在 scala 中运行控制台命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31896270/

相关文章:

scala - 让 `f =` 移动到 => 或 ⇒

scala - 表达相似值对象的惯用 scala/FP 方式

Scala 惯用语从迭代器中找到第一个选项

scala - Play Framework中Silhouette和Deadbolt 2有什么区别

Android、scala 和 eclipse = 不稳定的混合

scala - 如何在doc任务中排除java源文件?

scala - Scala 的 future 如何跨多核安排

forms - 玩转2.3 scala forms——如何自定义约束消息

scala - 为什么嵌套的 FlatMaps 会在 Scala 中炸毁堆栈?

scala - 除缩放外,是否还有其他Scala模板引擎?