scala - 如何在scala程序中执行shell脚本(.sh文件)
问题描述
我是 Scala 编程的新手。我有一个.sh file
。我想使用 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
我的示例代码如下所示
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.!
}
}
执行上述代码后,我没有得到任何控制台输出。如果我错过了什么,请告诉我。谢谢。
解决方案
假设使用 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
(not ):#!/bin
#!/bin/sh
echo "Hello shell"
推荐阅读
- python-3.x - 对于列中的每个产品,确定带来产品次数最多的 user_id
- jenkins - 多个 Jenkinsfiles,一个代理标签
- java - 选择选项后页面自动刷新
- python-3.x - 使用 livy 向 AWS EMR 提交具有虚拟环境的 pyspark 作业
- python - Python:算法将每个第 n 个元素添加到列表中并进行碰撞检查
- sql - 格式化引入 Azure SQL 数据库的数据
- kubernetes - 哪个 apiVersion 与 k8s 作业和 imagePullSecret 一起使用
- python - 使用 Pandas 绘制和处理日期/时间数据
- flutter - 在 ListView.builder() 中选中/取消选中 ListTiles - Flutter
- javascript - 是否可以在 for 循环中遍历长度属性的条件语句?