Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果包含在if中,bash命令序列将失败。。。为什么?如何用POSIX风格编写它?_Bash_If Statement_Posix_Background Process - Fatal编程技术网

如果包含在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