如果包含在if中,bash命令序列将失败。。。为什么?如何用POSIX风格编写它?
以下命令序列工作正常如果包含在if中,bash命令序列将失败。。。为什么?如何用POSIX风格编写它?,bash,if-statement,posix,background-process,Bash,If Statement,Posix,Background Process,以下命令序列工作正常 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
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)
出什么事了?
如何在BASH中正确编写它?
如何在POSIX中编写它?简单地说:如果
文件
是常规文件(而不是命名管道),tail-f文件
永远不会完成。如果您的文件中没有任何与中的Started EhrBase匹配的消息,则此代码将永久挂起是正常的
即使没有周围的,它也永远不会结束,如果周围的,那么周围的代码肯定是一条红鲱鱼
也许您想等待一段时间来查看日志消息<代码>超时
(来自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
简单地说:如果file
是一个常规文件(而不是命名管道),tail-f file
永远不会结束。如果您的文件中没有任何与
中的Started EhrBase匹配的消息,则此代码将永久挂起是正常的
即使没有周围的,它也永远不会结束,如果周围的,那么周围的代码肯定是一条红鲱鱼
也许您想等待一段时间来查看日志消息<代码>超时
(来自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
为了与POSIX兼容,您可以简单地用管道替换流程:tail-f log | grep-m1“在”
中启动了eRbase。顺便说一句,我们要求每个问题只涉及一个问题。虽然“如何在POSIX中编写它?”很容易回答(如chepner所述,通过用管道替换流程),但允许问题包含多个其他问题使得内务管理(特别是,为程序员可能遇到的每个问题只维护一个规范问题)更加困难,因此,它违反了被关闭为“太宽”的规则/理由。@CharlesDuffy我将在将来避免这种情况。为了POSIX兼容性,您可以简单地用管道替换进程:tail-f log | grep-m1“在”
中启动了eRbase。顺便说一句,我们要求每个问题只涉及一个问题。虽然“如何在POSIX中编写它?”很容易回答(如chepner所述,通过用管道替换流程),但允许问题包含多个其他问题使得内务管理(特别是,为程序员可能遇到的每个问题只维护一个规范问题)更加困难,因此,由于“太宽”而被关闭是违反规则/理由的。@CharlesDuffy我将在将来避免这种情况。感谢你指出最明显的一点:“如果没有周围环境,它也永远不会结束。”。我一时失明:)为了成功启动应用程序,数据库必须在运行——我还没有检查过(真丢脸!)。你的回答帮助我避免再次遇到这个问题。谢谢你指出了最明显的一点:“如果没有周围的环境,它也永远不会结束。”。我一时失明:)为了成功启动应用程序,数据库必须在运行——我还没有检查过(真丢脸!)。你的回答帮助我避免再次遇到这个问题。
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