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

如何在scala程序中执行shell脚本(.sh文件),scala,Scala,我是Scala编程新手。我有一个.sh文件。我想用Scala运行这个文件。我尝试了以下链接中提供的解决方案。但这些对我不起作用 我在scala REPL中尝试了简单的echo命令,它工作得很好。但是当我在Scala程序中使用同一行代码时,我得到了如下java.io.IOException Exception in thread "main" java.io.IOException: Cannot run program "echo": CreateProcess error=2, The sy

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

我在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
src
- bin
  - script.sh
- scala
  - POC.scala
我的示例代码如下所示

import java.io._
import sys.process._
object POC {  
  def main( args: Array[String]) {     
    val p = "echo 'hello world'".!!
    println("#############################################       "+ p)   
  }
}
编辑:
根据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文件。 我有如下目录

Exception in thread "main" java.io.IOException: Cannot run program "echo": CreateProcess error=2, The system cannot find the file specified
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.!  
          }
        }

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

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

您使用的是哪个scala版本?我运行了相同的代码,得到了正确的输出。我使用的是scala 2.12版。4@ChaitanyaWaikar我使用的是Scala 2.11.2。我使用的版本有问题吗?当我通过scala REPL执行时,它工作正常,但无法通过scala IDE执行。也许您正面临这个问题:您的代码对我来说编译和运行良好。尝试输入
echo
程序的完整路径:
/bin/echo
(或您系统上的任何程序)。@Tom-谢谢您的回复。对于像“echo”这样的简单linux命令,它工作得很好。但当我试图执行.sh文件时,它不起作用。有什么想法吗?谢谢你的回复。我正在尝试在windows上运行它。有什么解决办法吗?@Valli69,你不能在开箱即用的Windows上运行shell脚本,因为缺少shell解释器。您必须将脚本重写为Windows批处理文件或安装解释器(参见示例)