Shell脚本,执行命令时,如果返回错误,则执行某些操作

时间:2013-11-14 17:50:26

标签: bash shell

我正在尝试自动执行我们的许多pre fs / db任务,但有一件事我不知道我发出的命令是否真的发生了。我想要一种能够通过执行该命令来查看某种返回代码的方法。如果由于权限被拒绝或任何错误而导致rm失败的地方。发出exit ..

如果我有这样的shell脚本:

rm /oracle/$SAPSID/mirrlogA/cntrl/cntrl$SAPSID.ctl;

psuedo代码可能类似于..

rm /oracle/$SAPSID/mirrlogA/cntrl/cntrl$SAPSID.ctl;
if [returncode == 'error']
  exit;
fi

我怎么可能,例如,执行该rm命令并退出,如果它是非rm'd。我将调整答案以执行多种其他类型的命令,例如sed -i -ecpumount

编辑:

假设我有一个写保护文件,例如:

$ ls -lrt | grep protectedfile
-rwx------ 1 orasmq  sapsys         0 Nov 14 12:39 protectedfile

运行以下脚本会产生以下错误,因为显然没有权限..

rm: remove write-protected regular empty file `/tmp/protectedfile'? y
rm: cannot remove `/tmp/protectedfile': Operation not permitted

这是我从你们家伙的答案中得出的结论..这是做这样事情的正确方法吗?另外我怎么能把错误rm: cannot remove / tmp / protectedfile':操作不允许`转储到日志文件?

#! /bin/bash
function log(){
    //some logging code, simply writes to a file and then echo's out inpit
}
function quit(){
   read -p "Failed to remove protected file, permission denied?"
   log "Some log message, and somehow append the returned error message from rm"
   exit 1;
}

rm /tmp/protectedfile || quit;

3 个答案:

答案 0 :(得分:1)

如果我理解你想要的东西,请使用:

rm blah/blah/blah || exit 1

答案 1 :(得分:0)

Usualy有些会使用这样的命令:

doSomething.sh
if [ $? -ne 0 ]
then
    echo "oops, i did it again"
    exit 1;
fi

B.T.W。搜索'bash退出状态'会给你带来很多好结果

答案 2 :(得分:0)

一种可能性:'包装',以便您可以检索原始命令stderr |和stdout?],也可能在放弃之前重试几次?等等。

这是一个重定向stdout和stderr

的版本

当然你根本无法重定向stdout(通常,你不应该,我想,在其余的脚本中使“try_to”函数更有用!)

export timescalled=0  #external to the function itself

try_to () {
    let "timescalled += 1"  #let "..." allows white spaces and simple arithmetics
    try_to_out="/tmp/try_to_${$}.${timescalled}" 
        #tries to avoid collisions within same script and/or if multiple script run in parrallel
    zecmd="$1" ; shift ;
    "$1" "$@" 2>"${try_to_out}.ERR" >"${try_to_out}.OUT"
    try_to_ret=$?
    #or: "$1" "$@" >"${try_to_out}.ERR" 2>&1  to have both in the same one
    if [ "$try_to_ret" -ne "0" ]
    then  log "error $try_to_ret while trying to : '${zecmd} $@' ..." "${try_to_out}.ERR" 
            #provides custom error message + the name of the stderr from the command
          rm -f "${try_to_out}.ERR" "${try_to_out}.OUT" #before we exit, better delete this
          exit 1 #or exit $try_to_ret ?
    fi
    rm -f "${try_to_out}.ERR" "${try_to_out}.OUT"
}

它很难看,但可以帮助^^

请注意,有很多事情可能会出错:'timecalled'可能会变得太高,tmp文件无法写入,zecmd可能包含特殊字符等等...