首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含在if中的bash命令序列会失败.菲-为什么?如何用POSIX风格写?

包含在if中的bash命令序列会失败.菲-为什么?如何用POSIX风格写?
EN

Stack Overflow用户
提问于 2020-09-05 14:48:45
回答 1查看 50关注 0票数 0

下面的命令序列运行良好

代码语言:javascript
复制
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)

但是当我尝试有条件地运行它们时,它们不像我想要的那样工作

代码语言:javascript
复制
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

结果是

代码语言:javascript
复制
0.13.0
[1] 17584

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-05 15:14:05

简单地说:如果file是一个常规文件(而不是命名管道),tail -f file就永远不会完成。如果您的文件中没有任何与Started EhrBase in匹配的消息,那么这段代码将永远挂起,这是正常的,也是预期的。

即使没有周围的if,它也永远不会完成--周围的代码肯定是一条红鲱鱼。

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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63755195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档