2013-03-12 26 views
0

我正在编写一个bash脚本来管理针对多个环境的GF服务器的部署。我想知道的是如何获得GF命令的结果,然后确定是继续还是退出。在bash中使用glassfish命令捕获错误[在管道中返回代码]

例如

说我要重新部署,我有此脚本

$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; 

但是,它似乎并没有工作。

回答

1

的问题是

$GF_ASADMIN ... | tee -a $LOG 

$?反映tee返回代码。

您正在寻找PIPESTATUS。见man bash

PIPESTATUS

一个数组变量(见下文阵列)包含从最近最多执行的 前台管道的过程退出 状态的值的列表(其可以仅包含单个命令)。

也参见该例子中,以澄清PIPESTATUS

false | true 
echo ${PIPESTATUS[@]} 

输出是:1 0

校正的代码是:

RC=${PIPESTATUS[0]} 
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"