scala - 如何将 shell 脚本(bash)转换为 Scala 代码?

标签 scala processbuilder

我有一个包含一系列已定义步骤的 shell 脚本。我试图通过保持步骤的顺序将脚本转换为 Scala 代码。基本上我希望我的 Scala 代码成为 shell 脚本的镜像。

我使用过 sys.process._ 库。 shell 脚本的命令如下:

mkdir <pathToDir>
hadoop fs -copyToLocal <source> <dest>
rm -r <pathToDir>
java -jar <someScript>

我需要保持这些步骤的执行顺序。

我试过类似的东西:

import sys.process._
Class A {
  def processMethod(): Unit = { 
    Process("mkdir -p <dir1>") #| Process("hadoop fs -copyToLocal 
    <hdfsDir1> <localDir1>") #| Process("mkdir -p <dir2>") #| 
    Process("hadoop fs -copyToLocal <hdfsdir2>/*.parquet <localDir2>") 
    #| Process("java -jar <pathToJarFile> -script <sampleScripts> 1>&2") 
    #| Process("rm -r<localDir1>") #| Process("rm -r <localDir2>") ! 
  }
}

我希望这些操作按照定义的顺序执行。我对 ProcessBuilder/Process 的工作方式感到困惑,或者是否有替代方法可以将整个事情转换为 Scala 代码?

最佳答案

根据document , #| 构造一个命令,该命令将运行命令并将输出传递给其他命令。 话虽如此,Scala中的以下代码:

(Process("echo hello") #| Process("wc -c")).!

相当于下面的 Bash 代码:

echo hello | wc -c

这不是你想要的。

你要找的是###构造一个命令的运算符,该命令将运行一个命令,然后运行另一个命令。

使用此运算符,您可以编写以下 Scala 代码:

(Process("ls") ### Process("echo hello")).!

相当于下面的 Bash 代码:

ls
echo hello

但是,请注意,以上述方式使用 Process 并不完全等同于 bash,因为它无法使用 cd 更改当前目录,也无法使用诸如 if 之类的 bash 语法, for, case.

如果您真的想要 bash 等效代码,唯一的方法是使用 bash 运行脚本。

关于scala - 如何将 shell 脚本(bash)转换为 Scala 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54452294/

相关文章:

scala - PartialFunction 与 Function1 语法方面

java.io.IOException : Cannot run program "": CreateProcess error=2, 系统找不到指定的文件

scala - 负逻辑实现不适用于spark/scala

scala - Scala中结合filterNot/match/case的简洁方式

java - 读取java进程的输入流

java - 如何通过 ProcessBuilder 在 Java 中调用 CUDA C 应用程序?

java - 在 GWT Web 应用程序中调用外部应用程序(即 Windows 计算器)

java - 带参数的批处理文件执行 - [Java - OpenSSL]

Scala lambda 函数在声明参数类型时未解析?

scala - 与 java 相比,case 类的序列化如何工作?