Scala - 带管道的shell命令

时间:2012-10-07 20:29:42

标签: scala

我是Scala初学者,我正在编写一个用于调用shell命令的包装器。目前我正在尝试使用来自指定目录的管道来调用shell命令。

为了达到这个目的,我写了一个简单的实用程序:

def runCommand(command: String, directory: File): (Int, String, String) = {

  val errbuffer = new StringBuffer();
  val outbuffer = new StringBuffer();

  //run the command
  val ret = sys.process.Process(command, directory) !
  //log output and err
  ProcessLogger(outbuffer append _ + "\n", outbuffer append _ + "\n");

  return (ret, outbuffer.toString(), errbuffer.toString());
}

但是使用此实用程序我不能使用管道,例如:

runCommand("ps -eF | grep -i foo", new File("."));

首先我想,管道是shell的功能,所以我尝试了“/ bin / sh -c ps -eF | grep -i foo”,但似乎忽略了管道右侧的表达式。

我也尝试过运行命令!语法(sys.process._包),但我无法弄清楚,如何从指定目录调用命令(不使用“cd”)。

请你指教一下,如何正确地做到这一点?

1 个答案:

答案 0 :(得分:7)

更改

val ret = sys.process.Process(command, directory) !

val ret = sys.process.stringSeqToProcess(Seq("/bin/bash", "-c", "cd " + directory.getAbsolutePath + ";" + command))

或者您可以直接使用Scala提供的魔力:

import.scala.sys.process._
val ret = "ps -ef" #| "grep -i foo" !