2016-12-01 2 views
0

Дано:IOException при запуске процесса

$pwd 
/home/kmeredith/src/linux_sandbox 
$ls a.txt 
a.txt 
$cat a.txt 

$ 

Затем я попытался запустить scala.sys.process.Process что бы добавляемых «привет» в a.txt:

import scala.sys.process._ 
import java.io.File 

scala> Process(List("echo 'hi' >> a.txt"), new File(".")) 
res3: scala.sys.process.ProcessBuilder = [echo 'hi' > a.txt] 

scala> res3.! 
java.io.IOException: Cannot run program "echo 'hi' > a.txt" (in directory "."): 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) 
    ... 32 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) 
    ... 35 more 

Обратите внимание, что это также не удалось, когда я дал полный путь :

scala> Process(List("echo 'hi' > a.txt"), new File("/home/kmeredith/src/linux_sandbox")) 
res0: scala.sys.process.ProcessBuilder = [echo 'hi' > a.txt] 

Почему я вижу эту ошибку?

scala> res0.! 
java.io.IOException: Cannot run program "echo 'hi' > a.txt" (in directory "/home/kmeredith/src/linux_sandbox"): 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) 
    ... 32 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) 
    ... 35 more 
+0

Вы уверены, что относительные пути работы? http://stackoverflow.com/questions/11576767/setting-current-working-directory-when-executing-a-shell-process –

+0

Нет, я не уверен относительно относительных путей (хороший вопрос). Но это тоже не получилось, когда я прошел полный путь. –

ответ

1

Вы можете использовать ProcessBuilder DSL для перенаправления вывода:

Seq("echo", "some text") #>> new File("a.txt") 

Здесь Seq[String] будет неявно преобразован в ProcessBuilder. Каждый элемент Seq будет рассматриваться как аргумент команды (первый элемент echo) и надлежащим образом экранирован, поэтому вам не нужно какое-либо дополнительное цитирование (и не должно помещаться там >>).

Файл, который вы передаете в качестве второго аргумента, это cwd (текущий рабочий каталог), поэтому в данном конкретном случае он ничего не меняет. См. Раздел «Обработка входных и выходных данных» раздела sys.process docs.

+0

Это вернуло код выхода 0, '" hi "' не был добавлен: '$ cat a.txt' показывает пустую строку. –

+0

Хорошо, я вижу. '>>' рассматривается как часть аргумента. Поэтому используйте DSL с '# >>', он работает. Я обновлю ответ. – laughedelic

Смежные вопросы