【问题标题】:How to execute shell script (.sh file) in scala program如何在scala程序中执行shell脚本(.sh文件)
【发布时间】:2019-03-28 18:34:21
【问题描述】:

我是 Scala 编程的新手。我有一个.sh file。我想使用 Scala 运行这个文件。我已经尝试了以下链接中提供的解决方案。但这些对我不起作用。

Execute shell script from scala application

我在 scala REPL 中尝试过简单的 echo 命令,它工作正常。但是当我在 Scala 程序中使用同一行代码时,我得到了java.io.IOException,如下所示。

Exception in thread "main" java.io.IOException: Cannot run program "echo": CreateProcess error=2, The system cannot find the file specified

我的示例代码如下所示

import java.io._
import sys.process._
object POC {  
  def main( args: Array[String]) {     
    val p = "echo 'hello world'".!!
    println("#############################################       "+ p)   
  }
}

EDIT: 根据 Tom 的回复,我已经修改了上面的代码,如下所示,现在可以正常工作并在控制台中获取 Hello world

    import java.io._
    import sys.process._
    object POC {  
      def main( args: Array[String]) {     
        val p = Seq("echo", "hello world")
        val os = sys.props("os.name").toLowerCase
        val panderToWindows = os match {
           case x if x contains "windows" => Seq("cmd", "/C") ++ command
           case _ => command
        }
        panderToWindows.!  
      }
    }

现在我的确切问题是执行我的 script.sh 文件。 我有如下目录。

src
- bin
  - script.sh
- scala
  - POC.scala

script.sh 代码:

#!/bin
echo "Hello world"

我的 POC.scala 包含以下代码。

        import java.io._
        import sys.process._
        object POC {  
          def main( args: Array[String]) {     
            val command = Seq("/bin/script.sh")
            val os = sys.props("os.name").toLowerCase
            val panderToWindows = os match {
               case x if x contains "windows" => Seq("cmd", "/C") ++ command
               case _ => command
            }
            panderToWindows.!  
          }
        }

执行上述代码后,我没有得到任何控制台输出。如果我错过了什么,请告诉我。谢谢。

【问题讨论】:

  • 您使用的是哪个 scala 版本?我运行了相同的代码并得到了正确的输出。我正在使用 scala 版本 2.12.4
  • @ChaitanyaWaikar 我正在使用 Scala 2.11.2。我使用的版本有问题吗?当我通过 scala REPL 执行时它工作正常,但无法通过 scala IDE 执行。
  • 也许你正面临这个问题:stackoverflow.com/questions/24320446/…
  • 您的代码对我来说编译和运行良好。尝试输入echo 程序的完整路径:/bin/echo(或您系统上的任何内容。)
  • @Tom - 感谢您的回复。它适用于像“echo”这样的简单 linux 命令。但是当我尝试执行 .sh 文件时它不起作用。有什么想法吗?

标签: scala


【解决方案1】:

假设使用Linux,可以从一个简单的"pwd"!开始,它会显示工作目录,然后使用相对或绝对路径调用shell脚本。例如:

import sys.process._

object POC extends App{
  val path = "pwd".!!.trim
  println(path)
  s"$path/src/main/bin/test.sh".!
  "src/main/bin/test.sh".!
}

返回:

/home/user/temp/scala-shell-script
Hello shell
Hello shell

顺便说一句,shell 脚本通常在 shebang 行中有#!/bin/sh(不是#!/bin):

#!/bin/sh
echo "Hello shell"

【讨论】:

  • 感谢您的回复。我正在尝试在 Windows 上运行它。有什么解决办法吗?
  • @Valli69,由于缺少 shell 解释器,您无法在 Windows 上运行 shell 脚本。您必须将脚本重写为 Windows 批处理文件或安装解释器(参见例如 stackoverflow.com/questions/26522789/…
猜你喜欢
  • 2022-01-09
  • 2018-08-10
  • 2019-11-15
  • 2020-03-16
  • 1970-01-01
  • 2011-05-21
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多