如何在scala sys.process调用上进行shell扩展

时间:2015-06-05 04:33:00

标签: scala process expansion

考虑一下shell扩展的简单尝试:

简单/直接的方法

scala> ("/bin/ls /tmp/*" run BasicIO(false, sb, None)).exitValue
ls: /tmp/*: No such file or directory
res18: Int = 1

我已经尝试了许多ProcessIO,BasicIO,Process等的组合,但无法弄清楚如何让shell扩展工作。

bash -c

scala> ("bash -c \"/bin/ls /tmp/*\"" run BasicIO(false, sb, None)).exitValue
/tmp/*": -c: line 0: unexpected EOF while looking for matching `"'
/tmp/*": -c: line 1: syntax error: unexpected end of file
res19: Int = 2

管道打击-s

scala> ("echo \"/bin/ls /tmp/*\" | bash -s") run BasicIO(false, sb, None)).exitValue
<console>:1: error: ';' expected but ')' found.
       ("echo \"/bin/ls /tmp/*\" | bash -s") run BasicIO(false, sb, None)).exitValue

顺便说一下shell中的最后一个看起来像下面这样(并且有效):

21:28:32/dstat $echo "/bin/ls /tmp/*" | bash -s

/tmp/OSL_PIPE_501_SingleOfficeIPC_a974a3af70d46eaeed927022833718b7
/tmp/oobelib.log
/tmp/spark-steve-org.apache.spark.deploy.master.Master-1.pid
/tmp/spark-steve-org.apache.spark.deploy.worker.Worker-1.pid
/tmp/KSOutOfProcessFetcher.501.qQkpPp2uZLdVc5pukHmfJMR4bkM=:

shell转义也有兴趣了解wrt scala Process类:包括扩展和转义的示例都是最佳的。

更新我发现了这个JIRA - 它可能是相关的。我希望不会 - 这意味着这里描述的功能很少/没有希望..

sys.process._对于它无法接受的内容具有如此严格的限制 https://issues.scala-lang.org/browse/SI-7027

另一次更新我发现了一个旧电子邮件主题,其中涉及受尊敬的 Daniel Sobral ,他们提到:

  

因为引号没有分隔传递给bash的参数 -   是Scala决定论证如何分解,而且简单   拆分空格,没有任何报价工具。如果你试试   相反,它将起作用:

     

Seq(“bash”,“ - c”,“ls * .scala”)。!

对于运行shell命令的“即发即忘”版本来说,看起来更加严峻。我渴望 ruby​​

 %x{whatever shell string you want goes here}

e.g。

  

echo'print%x {ls -lrtad / etc / * 2&gt;&amp; 1}'|红宝石

最满意的回报:

-r--r--r--   1 root   wheel          69836 May 28  2013 /etc/php.ini.default-

5.2-previous~orig
lrwxr-xr-x   1 root   wheel             30 Oct 22  2013 /etc/localtime -> /usr/share/zoneinfo/US/Pacific
-rw-r--r--   1 root   wheel            102 Nov  5  2013 /etc/hostconfig
-rw-r--r--   1 root   wheel           1286 Nov  5  2013 /etc/my.cnf
-rw-r--r--   1 root   wheel           4161 Dec 18  2013 /etc/sshd_config~previous
-rw-r--r--   1 root   wheel            199 Feb  7  2014 /etc/shells
-rw-r--r--   1 root   wheel              0 Sep  9  2014 /etc/xtab
-rw-r--r--   1 root   wheel           1316 Sep  9  2014 /etc/ttys
  .. etc

但看起来像没有发生与Scala ..

1 个答案:

答案 0 :(得分:0)

我担心你的回答是错误的。 Ruby正在做同样的事情,我知道这一点而不看他们的代码,因为Java(以及扩展名,Scala)作为API呈现的是Unix API的直接翻译。

它是 shell 进行shell扩展,虽然任何其他软件都可以模拟它们,但这将是一场失败的游戏。通常提供通配符,但它们只是shell扩展的一小部分。

我的回答中包含您需要的一切,但让我对此进行扩展:

$('.k-grid-content').find('tr').eq(3).css('background-color', 'red');

然后你可以做

import scala.sys.process._
implicit class RubyX(val sc: StringContext) extends AnyVal {
  def x(args: Any*): ProcessBuilder = {
    val strings = sc.parts.iterator
    val expressions = args.iterator
    var buf = new StringBuffer(strings.next)
    while(strings.hasNext) {
      buf append expressions.next
      buf append strings.next
    }
    Process(Seq("bash", "-c", buf.toString))
  }
}

我返回了一个ProcessBuilder,所以你可以为你选择最好的执行形式,例如上面的x"ls *.scala".! 返回退出代码并将其他所有内容回传给stdout。