如何解决如果将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 举报,一经查实,本站将立刻删除。