微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果将bash命令包含在以下命令中,则bash命令序列将失败:fi-为什么?以及如何以POSIX风格编写它?

如何解决如果将bash命令包含在以下命令中,则bash命令序列将失败:fi-为什么?以及如何以POSIX风格编写它?

以下命令序列运行正常

EHRbase_VERSION=$(mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec)
echo ${EHRbase_VERSION}
java -jar application/target/application-${EHRbase_VERSION}.jar --cache.enabled=false > log &
grep -m 1 "Started EhrBase in" <(tail -f log)

但是,当我尝试有条件地运行它们时,它们将无法正常运行

if [ "${MY_ENV}" != "FOO" ]; then
  EHRbase_VERSION=$(mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec)
  echo ${EHRbase_VERSION}
  java -jar application/target/application-${EHRbase_VERSION}.jar --cache.enabled=false > log &
  grep -m 1 "Started EhrBase in" <(tail -f log)
fi

结果是

0.13.0
[1] 17584

# from here it seems to hang and I have to exit w/ CTRL+C

出了什么问题? 如何在BASH中正确编写? 如何在POSIX中编写它?

解决方法

简而言之:如果file是常规文件(而不是命名管道),则tail -f file永远不会结束。如果您的文件中没有 任何与Started EhrBase in匹配的消息,则此代码会永久挂起是正常的,并且应该永久挂起。

即使没有周围的if也永远不会结束-周围的代码肯定是红色的鲱鱼。


也许您只想等待一段时间才能查看日志消息? timeout(来自GNU coreutils)是您的朋友:

java -jar "application/target/application-${EHRbase_VERSION}.jar" \
    --cache.enabled=false >log & app_pid=$!
if ! tail -f log | timeout 30s grep -m 1 "Started EhrBase in"; then
  echo "WARNING: Did not see a startup message even after waiting 30s" >&2
  if kill -0 "$app_pid"; then
    echo "...although EHRbase is still running" >&2
  else
    echo "...and EHRbase did not successfully start" >&2
  fi
fi

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。