【问题标题】:Error: md5sum: stat '>': No such file or directory错误:md5sum: stat '>': No such file or directory
【发布时间】:2020-03-19 16:22:31
【问题描述】:

我正在尝试编写一个使用 Scala 运行 Linux 命令的程序。

我已经编写了一段代码来运行md5sum 命令的功能。

代码sn-p

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

我不知道为什么。有什么办法让它工作吗?

【问题讨论】:

  • 通过> 的管道是由shell(如bash)提供的。如果你想使用它,你不能直接执行md5sum,你必须让一个shell来做。
  • 但是为什么要调用外部进程呢?您可以在 Scala 或 Java 本身中轻松执行 MD5 操作。 stackoverflow.com/q/415953/14955
  • 如果“外部 linux 命令”包括管道,则通过 stackoverflow.com/a/3776277/14955 中的 shell 进行
  • 如果你被要求创建一个框架来执行任意命令,你不能开始考虑提供命令的替代方案。你甚至不会知道> outputfile 是该命令的一部分。如果在您的任务范围内捕获给定命令的输出并将其写入您选择的文件,您可以这样做。关闭> outputfile 部分,然后输出将被写入标准输出,您可以将其接受为 Scala 字符串。 stackoverflow.com/q/16714127/14955

标签: linux scala


【解决方案1】:

您的界面似乎没有经过深思熟虑。请注意,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()

【讨论】:

  • 非常感谢@jwvh,我没有意识到这个错误。你能解释一下这是做什么的吗? .#|(Seq("tee", outfile))
  • #|ProcessBuilder 管道方法,tee 是 Linux tee 命令(在我的系统上是 /usr/bin/tee)。所以你可以把它想象成:md5sum &lt;files&gt; | tee $outfile
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2023-04-03
  • 1970-01-01
  • 2018-09-30
相关资源
最近更新 更多