我正在寻找如何将字符串提交给外部bash逐字。 Bash应该处理通配符扩展和转义。
测试是使用流程库:
import sys.process._
将所需的进程DSL意图导入范围。
让我们尝试转义测试:这是在bash shell上运行的理想结果:
$echo -ne 'abc\t\n' | tr '\t' 'T'
abcT
$
让我们尝试一下sys.process:
scala> "echo -ne 'abc\t\n' | tr '\t' 'T'" !!
warning: there were 1 feature warning(s); re-run with -feature for details
res16: String =
"-ne 'abc ' | tr ' ' 'T'
"
失败 ..不同于命令行..
现在让我们尝试扩展测试(OS / X风格):
scala> "open /shared/adm*" !!
warning: there were 1 feature warning(s); re-run with -feature for details
The file /shared/adm* does not exist.
java.lang.RuntimeException: Nonzero exit value: 1
at scala.sys.package$.error(package.scala:27)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:131)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:101)
失败 ..此处未执行通配符扩展。
所以..我应该采用旧的java Process方式 - 即执行" bash -c"然后发送整个命令行?
答案 0 :(得分:2)
注意:运行外部命令(sed
,cat
,ls
等)与bash
中构建的命令(例如{)之间存在差异{1}},cd
和通配符。使用|
包不允许您从字符串运行process
命令。
这是我尝试在Scala(2.10)中实现您想要的内容。第一种方法仅使用bash
包提供的方法。第二种方法是间接调用process
来运行整个命令。
bash