我正在尝试自动执行我们的许多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 -e
,cp
和umount
假设我有一个写保护文件,例如:
$ 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;
答案 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可能包含特殊字符等等...