我正在尝试编写一个使用Scala运行Linux命令的程序。
我已经编写了一段代码来运行md5sum
命令的功能。
代码段
object Test extends App {
import sys.process._
case class md5sum_builder private(i: Seq[String]) {
println(i)
protected def this() = this(Seq(""))
def optionCheck() = new md5sum_builder(i :+ "-c")
def files(file: String) = new md5sum_builder(i :+ file)
def hashFile(hashfile: String) = new md5sum_builder(i :+ hashfile)
def assignment(operator: String) = new md5sum_builder(i :+ operator)
def build() = println(("md5sum" + i.mkString(" ")).!!)
}
object md5sum_builder {
def apply() = new md5sum_builder
}
md5sum_builder().files("text.txt").files("text1.txt").assignment(">").hashFile("hashes.md5").build()
}
当我尝试使用此程序运行命令md5sum text.txt text1.txt > hashes.md5
时,它将引发错误:
Error: md5sum: stat '>': No such file or directory
我不知道为什么。有什么办法可以使它起作用?
答案 0 :(得分:0)
您的界面似乎没有经过深思熟虑。请注意,files()
,hashFile()
和assignment()
都做相同的事情。所以有人可以来做这样的事情...
md5sum_builder().assignment("text0.txt")
.hashFile("text1.txt")
.files(">") // <--shell redirection won't work
.assignment("hashes.md5")
.build()
...并获得与您发布的示例相同(非功能性)的结果。
这是一个修正,可以纠正该错误并允许重定向输出。
case class md5sum_builder private(i :Seq[String], outfile :String = "/dev/null") {
protected def this() = this(Seq.empty[String])
def optionCheck(file :String) = this.copy(i = i ++ Seq("-c", file))
def file(file: String) = this.copy(i = i :+ file)
def hashFile(file: String) = this.copy(outfile = file)
def build() = println(("md5sum" +: i).#|(Seq("tee", outfile)).!!)
}
现在,这些方法几乎可以按任何顺序使用,仍然可以获得预期的结果。
md5sum_builder().file("text0.txt")
.hashFile("hashes.md5")
.file("text1.txt")
.build()