逐字执行bash命令字符串(包括扩展和转义)

时间:2015-05-30 08:02:28

标签: bash scala process

我正在寻找如何将字符串提交给外部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"然后发送整个命令行?

1 个答案:

答案 0 :(得分:2)

注意:运行外部命令(sedcatls等)与bash中构建的命令(例如{)之间存在差异{1}},cd和通配符。使用|包不允许您从字符串运行process命令。

这是我尝试在Scala(2.10)中实现您想要的内容。第一种方法仅使用bash包提供的方法。第二种方法是间接调用process来运行整个命令。

bash