【问题标题】:Execute cmd in scala with space char in s3 path在 scala 中使用 s3 路径中的空格字符执行 cmd
【发布时间】:2020-01-22 21:28:50
【问题描述】:

我希望使用以下命令在 scala 中执行 shell cmds

def executeShellCommand(cmd: String): Unit = {
   if (cmd.! != 0) {
     throw new RuntimeException(s"Error executing command '$cmd'")
   }
}

我收到一个类似下面的 cmd,它在 s3 路径中包含一个空格(From Sender)

"aws s3 cp s3://external-bucket/From Sender/my-file.txt s3://my-bucket/my-file.txt"

很遗憾,运行这个 cmd 时出现错误。

我相信如果我可以将其转换为序列,cmd 将正常工作

Seq("aws", "s3", "cp", "s3://external-bucket/From Sender/my-file.txt", "s3://my-bucket/dataset/my-file.txt").!

cmd 字符串来自外部来源,因此我无法轻松将其转换为序列。我尝试将 s3 存储桶路径用引号括起来,但这也不起作用。

有什么想法可以在 scala 中运行这个 cmd 吗?

【问题讨论】:

  • 您确定修复命令是您的工作吗?在我看来,为您提供命令的服务应该确保它们是有效的。
  • 您能否修改 cmd 字符串,例如通过引用文件?能做到的话,转成序列应该很容易
  • 这是一个很好的观点,cmd 的供应商正在发送一个不正确的。不过,如果框架能够处理转义引号中的 s3 路径的情况,那就太好了

标签: scala amazon-s3


【解决方案1】:

好吧,shell 无法为您执行该命令的原因是因为它不知道如何将其拆分为参数。因此,除非您有任何有关该命令的其他信息,可以用来修复它,否则您将不走运。

如果您确实有其他信息,您可以尝试修复它,但 YMMV。例如,如果你知道参数列表总是一堆 s3 路径,你可以这样做:

 cmd.split("(?=s3://)").flatMap { 
   case x if x.startsWith("s3://") => Seq(x.trim) 
   case x => x.split(" ")
 }.toSeq.!

【讨论】:

  • 感谢您的建议。不幸的是,我发现用引号将路径括起来是行不通的。我知道的唯一解决方案是拆分成一个序列
  • 是的,抱歉,刚刚意识到这一点。我更新了答案以显示如何拆分它。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2012-08-30
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
相关资源
最近更新 更多