【问题标题】:Using scala.sys.process to invoke echo on Windows 7使用 scala.sys.process 在 Windows 7 上调用 echo
【发布时间】:2012-08-15 10:19:06
【问题描述】:

我正在尝试使用 Scala 内部的外部程序,该程序接受来自标准输入流的输入。

代码大致相当于以下在 Linux 上运行,但在 Windows 上运行时引发异常(在 Windows 7 上测试)。异常的描述表明找不到 echo 命令。

def invokeProgram(data : String) {
       import scala.sys.process._
       val cmdEcho = Seq("echo", data)
       val cmdProgram = Seq("program")
       println((cmdEcho #| cmdProgram).!!)
}

代码在 Linux 上可以正常工作,但在 Windows 上失败,但是 echo 命令对两个平台都很常见,并且它的用法在语法上对于我的目的是相同的。这就像 echo 不在 PATH 中一样简单吗? Windows 上什至有单独的 echo.exe 还是捆绑到其他东西中?可以使调用的程序从临时文件中接受其输入,如果我无法解决此问题,我将使用该文件。

【问题讨论】:

    标签: shell scala windows-7 cross-platform dos


    【解决方案1】:

    区别是这样的:

    dcs@shadowfax:~$ which echo
    /bin/echo
    

    也就是说,在 Unix 上,echo 命令实际上是一个二进制文件,尽管大多数 shell 将其实现为内置命令。另一方面,在 Windows 上,没有名为 echo.exe(或 echo.com 等)的二进制文件。它只是一个 shell 的内置命令。

    【讨论】:

    • 这是我关于原因的理论之一,感谢您确认。我不确定“哪个”本身证明 echo 是一个单独的可执行文件,因为它仍然可以捆绑到一个单一的整体 shell 可执行文件中,每个命令都有不同的硬链接或符号链接。我确信我使用的系统就是这种情况,尽管它似乎不符合 Unix 哲学。
    • @DuncanACoulter 证明PATH中有一个名为echo的二进制文件。当您调用"echo x".! 时,它会在PATH 中搜索名称为echo 的二进制文件,因此,前者证明后者可以工作。
    • 对不起,我觉得我离题太远了,没有很好地解释自己。我只是在想一个场景,每个命令行实用程序例如/bin/echo 或 /bin/ls 实际上是指向单个可执行文件的符号链接,例如 /bin/shell,根据调用它的符号链接的名称(例如通过检查 C++ 中的 argv[0]),它的行为有所不同。在这种情况下,即使没有这样的二进制文件,执行“which echo”也会返回 /bin/echo。另一种选择是我确实清楚地解释了自己,但这毕竟不是一个非常好的观点。不管怎样,谢谢。
    • @DuncanACoulter 是的,我明白这一点,但这无关紧要。重要的是执行/bin/echo ok 会回显“ok”——echo 是否是指向 shell 的链接并不重要,只要它完成了它应该做的事情。
    【解决方案2】:

    您根本不需要使用echo。而是使用ProcessBuilder 的#

    import java.io.ByteArrayInputStream
    import scala.sys.process._
    
    val data = "hello"
    val is = new ByteArrayInputStream(data.getBytes)
    "cat" #< is ! //complicated way to print hello
    

    【讨论】:

    • 谢谢你,这解决了我的问题,编辑示例以删除 cat 引用,因为整个想法是用于 Linux/Windows 跨平台开发。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2017-08-02
    • 2012-06-17
    • 1970-01-01
    • 2018-06-26
    • 2014-04-29
    相关资源
    最近更新 更多