使用glassfish命令捕获Bash中的错误[在管道中返回代码]

时间:2013-03-12 09:38:28

标签: bash glassfish pipe

我正在编写一个bash脚本来管理针对多个环境的GF服务器的部署。我想知道的是如何获得GF命令的结果,然后确定是继续还是退出。

例如

说我要重新部署,我有这个脚本

$GF_ASADMIN --port $GF_PORT redeploy --name  $EAR_FILE_NAME --keepstate=true $EAR_FILE | tee -a $LOG

变量已经定义。所以GF将开始重新部署,并且要么成功,要么失败。我想检查它是否确实并采取相应措施。我有这个权利。

RC=$?
if [[ $RC -eq 0 ]]; 
    then echoInfo "Application Successfully redeployed!" | tee -a $LOG; 
else
    echoError "Failed to redeploy application!"
    exit 1
fi;

然而,它似乎并没有起作用。

2 个答案:

答案 0 :(得分:1)

问题是管道

$GF_ASADMIN ... | tee -a $LOG

$?反映了tee的返回代码。

您正在寻找PIPESTATUS。见man bash

  

PIPESTATUS

     

包含退出列表的数组变量(请参阅下面的数组)   来自最近执行的进程的状态值   前台管道(可能只包含一个命令)。

另请参阅此示例以阐明PIPESTATUS

 false | true 
 echo ${PIPESTATUS[@]}

输出为:1 0

更正的代码是:

RC=${PIPESTATUS[0]}

答案 1 :(得分:0)

或尝试使用代码块重定向,例如:

{
  if "$GF_ASADMIN" --port $GF_PORT redeploy --name  "$EAR_FILE_NAME" --keepstate=true "$EAR_FILE"
  then
    echo Info "Application Successfully redeployed!"
  else
    echo Error "Failed to redeploy application!" >&2
    exit 1
  fi
} | tee -a "$LOG"