2015-08-08 2 views
2

Я хочу, чтобы запустить эту команду в 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 
+0

'sed', по-видимому, не находится на ПУТЕ. Почему бы не попробовать более простую команду, чтобы проверить это, прежде чем получить 'sed' и все его параметры вправо. 'какой sed' может быть хорошим выбором :) –

+0

' 'sed '.!' отлично работает! – Daniel

+0

Вы когда-нибудь пробовали 'command!' (Команда была строкой и без точки)? Кроме того, вы можете попробовать «val result =» sed -i '.back' 's/maxTablesPerQuestion/maxTablesPerQuestion = 2.0/g'/Пользователи/i-danielk/ideaProjects/aristo/solvers/tableilp/src/main/resources/application .conf "! '? – Bacon

ответ

3

Лучший способ для выполнения системных команд в Scala является для использования синтаксиса Sequence (см. код). Длинная строка с escape-символами намного более утомительна, чтобы получить право. У меня почти никогда не возникало проблем при использовании этого синтаксиса.

Следует отметить, что вам больше не нужно использовать одиночные ' или двойные кавычки ", чтобы определить сегменты вашей команды. Последовательность уже дает все необходимые данные для 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").! 
+0

Не могу поверить, что это сработало, пробовав все остальное. Благодаря! – Henry

+0

Рад, что это помогло! – marios