Scala进程与bash不同?

Scala进程与bash不同?,scala,Scala,为什么会出现以下情况: "find terraform -type f -exec sed -i 's/prevent_destroy *= .*/prevent_destroy = false/g' {} +".! 在以下情况下失败: sed: -e expression #1, char 1: unknown command: `'' 然而,它在一个外壳中运行良好 编辑: 另一个例子: "echo 'someText' > someFile").! "cat someFile".!

为什么会出现以下情况:

"find terraform -type f -exec sed -i 's/prevent_destroy *= .*/prevent_destroy = false/g' {} +".!
在以下情况下失败:

sed: -e expression #1, char 1: unknown command: `''
然而,它在一个外壳中运行良好

编辑: 另一个例子:

"echo 'someText' > someFile").!
"cat someFile".! // This doesn't print anything

为什么我不能在文件中写入?

如果我使用到ProcessBuilder的Seq隐式转换而不是字符串,这对我来说是可行的:

Seq("find", "terraform", "-type", "f", "-exec", "sed", "-i", "s/prevent_destroy *= .*/prevent_destroy = false/g", "{}", "+").!
请注意,sed substitution命令周围不需要引号

您的方式不起作用,因为字符串是如何转换的。看看scala源代码(scala.sys.process.process.scala):


它在空格上拆分字符串,这会破坏sed替换命令。最好改用Seq,以避免这种情况。

如果我使用Seq到ProcessBuilder的隐式转换,而不是字符串,这对我来说是有效的:

Seq("find", "terraform", "-type", "f", "-exec", "sed", "-i", "s/prevent_destroy *= .*/prevent_destroy = false/g", "{}", "+").!
请注意,sed substitution命令周围不需要引号

您的方式不起作用,因为字符串是如何转换的。看看scala源代码(scala.sys.process.process.scala):


它在空格上拆分字符串,这会破坏sed替换命令。为了避免这种情况,最好使用Seq。

您能发布更多的上下文吗?比如字符串在scala代码中是如何形成的?@tom得到了一个长的scala表达式。你能再发布一些上下文吗?比如字符串是如何在scala代码中形成的?@tom得到了一个长的scala表达式。这是一个很好的观点,但是如果我做了
Seq(“echo”,“sometext”,“someFile”)然后
“cat someFile”我们可以看到该文件不包含任何内容。@Joan
不是该命令的一部分,因此您应该(类似于)Seq(“bash”、“-e”、“echo sometext>someFile”)
或者是的,请查看文档以了解更多详细信息:
def#>(f:File):ProcessBuilder
将此过程的输出流写入给定的文件。您是否能够使用@dk14对
Seq(“bash”、“-c”、“您的命令在这里”)
Seq(“sh”、-c”、“您的命令在这里”)工作得很好,谢谢大家!这是一个很好的观点,但如果我做
Seq(“echo”,“sometext”,“someFile”)然后
“cat someFile”我们可以看到该文件不包含任何内容。@Joan
不是该命令的一部分,因此您应该(类似于)Seq(“bash”、“-e”、“echo sometext>someFile”)
或者是的,请查看文档以了解更多详细信息:
def#>(f:File):ProcessBuilder
将此过程的输出流写入给定的文件。您是否能够使用@dk14对
Seq(“bash”、“-c”、“您的命令在这里”)
Seq(“sh”、-c”、“您的命令在这里”)工作得很好,谢谢大家!