Process和ProcessBuilder

时间:2016-01-08 19:23:15

标签: java bash scala awk

我试图运行一个可以释放可用内存的进程,但进程生成器无法解析awk部分......

scala> import scala.sys.process._

scala> "grep MemFree /proc/meminfo" #| "awk '{print $2}'" !
awk: cmd. line:1: '{print
awk: cmd. line:1: ^ invalid char ''' in expression
res16: Int = 1

与此结果相同......

scala> Seq("grep", "MemFree /proc/meminfo") #| Seq("awk", "'", "{print $2}", "'") !
awk: cmd. line:1: '
awk: cmd. line:1: ^ invalid char ''' in expression

逃避不起作用......

scala> Seq("grep", "MemFree /proc/meminfo") #| Seq("awk", "\"'{print $2}'\"") ! 
res21: Int = 0

我怎样才能获得awk' {print $ 2}'上班?有没有办法检查进程构建器尝试执行的内容?

2 个答案:

答案 0 :(得分:2)

撇号仅用于bash以了解参数边界的位置。在Scala中,当您使用Seq时,会给出这些边界并且撇号没有意义,它们会传递给awk然后抱怨。

import scala.sys.process._

(Seq("grep", "MemFree", "/proc/meminfo") #| Seq("awk", "{print $2}")).!

另请注意,grep的参数必须分开。

顺便说一下,如果你想将值转换为Scala,可以使用!!

(Seq("grep","MemFree","/proc/meminfo") #| Seq("awk","{print $2}")).!!.trim.toInt

答案 1 :(得分:0)

在Bash或类似的shell中使用'对来表示其中的空格是不是分隔符用于单独的参数。即'{print $2}'表示awk命令的第一个参数应为字符串{print $2}

所以你正在寻找Seq("awk", "{print $2}")