如何在Scala程序中执行Shell脚本(.sh文件)

时间:2018-10-24 11:05:16

标签: scala

我是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: 根据汤姆的回应,我已经修改了上面的代码,如下所示,它现在可以正常工作,并且可以在控制台中使用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.!  
          }
        }

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

1 个答案:

答案 0 :(得分:0)

假设使用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"