考虑一下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 ..
答案 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。