我有一个包含一系列已定义步骤的 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/