Sbt 如何在脚本中获取目标目录?

Sbt 如何在脚本中获取目标目录?,sbt,Sbt,我正在尝试获取多模块项目中模块的目标目录。我面临的挑战是,SBT的日志记录使得在脚本中使用变得很困难 以下是我目前的情况: function sbt-target { sbt -Dsbt.log.noformat=true "project $1" 'show target' | tail -n1 | cut -c8- } 我认为这是非常刻薄的,因为它知道SBT每个输出行的[INFO]前缀(cut-c8-),并且知道SBT的最后一行是我需要的输出(尾部-n1) 更成问题的是

我正在尝试获取多模块项目中模块的目标目录。我面临的挑战是,SBT的日志记录使得在脚本中使用变得很困难

以下是我目前的情况:

function sbt-target {
  sbt -Dsbt.log.noformat=true "project $1" 'show target' |
    tail -n1 |
    cut -c8-
}
我认为这是非常刻薄的,因为它知道SBT每个输出行的[INFO]前缀(cut-c8-),并且知道SBT的最后一行是我需要的输出(尾部-n1)

更成问题的是,每次调用sbt target几乎需要11秒,因此在该项目中为大量模块的每个模块调用它占据了大部分时间


如何在脚本中获取目标目录?

我无法与SBT通话。在BASH最佳实践方面,您可能会考虑更类似于以下的内容:

sbt_target() {
  # declare locals as such
  local line version
  # iterate through all lines; later lines overwrite variable set by prior ones
  while read -r line; do
    version=${line#"[INFO] "} # strip undesired prefix if present
  done < <(sbt -Dsbt.log.noformat=true "project $1" 'show target')
  # emit result to stdout
  printf '%s\n' "$version"
}
sbt_目标(){
#宣布当地人是这样的
本地线路版本
#遍历所有行;后面的行覆盖前面的行设置的变量
当读取-r行时;执行
version=${line#“[INFO]”}#如果存在不需要的前缀,请去掉

donefunction
关键字与POSIX不兼容,也没有在函数名中使用破折号——而且,bash在其文档中没有承诺后一种行为将继续工作,因此利用它是有风险的。声明函数的可移植方式就是
sbt_target(){…}
…顺便说一句,我在回答中确实使用了一些bash主义。区别在于(1)它们是bash的文档保证在未来版本中将继续起作用的东西,以及(2)它们提供了与等效的POSIX兼容代码相比的功能优势。我删除了bash标记,因为问题实际上是关于SBT而不是bash的。很抱歉混淆:)运行
SBT-Dsbt.log.noformat=true“项目示例”“show target”
需要11秒,因此在管道上切换上下文会损失很少的时间。这实际上是关于SBT而不是Bash的。谢谢你的建议:)对于更复杂的Bash脚本,我会记住这一点。很抱歉,我非常晚才接受。这是一个合法的答案,因为它使依赖于e**[INFO]**前缀显式。它还教会了我一些关于Bash的事情,我以前没有意识到。我很久以前就打算回来接受它。我最后用的是:)