【发布时间】:2015-05-30 08:02:28
【问题描述】:
我正在寻找如何将字符串逐字提交给外部 bash。 Bash 应该处理通配符扩展和转义。
使用流程库进行测试:
import sys.process._
将所需的流程 DSL 隐式导入范围。
让我们尝试 escaping 测试:这是在 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”然后发送整个命令行?
【问题讨论】:
-
您要求 bash 实现的功能,例如管道和通配符,因此请通过 bash 运行它们!请参阅scala-lang.org/api/2.11.5/… 以获得一些启示。
-
@DavidWeber 该页面没有解决扩展或转义问题——而且我已经知道所描述的管道和通配符支持。