我正在编写一个 bash 脚本,该脚本应该退出最后一个失败命令的错误代码,而不是继续执行。这可以通过在各处添加 a 来实现|| exit $?
,但是有没有更简单的方法,例如set
在开始时选择一个选项来执行此操作而不丑化每一行?
答案1
set -e
?
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Set or unset values of shell options and positional parameters.
Change the value of shell attributes and positional parameters, or
display the names and values of shell variables.
Options:
-a Mark variables which are modified or created for export.
-b Notify of job termination immediately.
-e Exit immediately if a command exits with a non-zero status.
...
答案2
您可以在块的最后&&
使用 和 use连接所有命令。|| exit $?
例如:
#!/usr/bin/ksh
ls ~/folder &&
cp -Rp ~/folder ~/new_folder &&
rm ~/folder/file03.txt &&
echo "This will be skipped..." ||
exit $?
如果没有文件,则将跳过~/folder/file03.txt
最后一条命令。echo
您应该收到如下内容:
$ ./script.ksh
file01.txt file02.txt
rm: cannot remove /export/home/kkorzeni/folder/file03.txt: No such file or directory
$ echo $?
1
最好的问候,克日什托夫
答案3
您可以定义陷阱函数来捕获脚本中发生的任何错误。
#!/usr/bin/ksh
trap errtrap
function errtrap {
es=$?
echo "`date` The script failed with exit status $es " | $log
}
脚本的其余部分如下。
TRAP 将捕获任何命令的任何错误并调用该errtrap
函数。为了更好地使用,您可以使该errtrap
函数通用并在您创建的任何脚本中调用该函数。