exit
调用错误时不会终止脚本..
输出
Error: Could not resolve localhost
after exit
脚本
#!/bin/sh
resolve_ip (){
if [ -z "$1" ]; then
host="localhost"
ip=$(dig +short myip.opendns.com @resolver1.opendns.com)
else
host="$1"
ip=$(dig +short $1)
fi
if [ -z "$ip" ]; then
error "Could not resolve $host"
fi
echo "$ip"
}
error (){
(>&2 echo "Error: $1")
exit 1
}
master_host='google.com'
if [ "$(resolve_ip)" = "$(resolve_ip $master_host)" ]; then
error "some error"
fi
echo "after exit"
exit
exit
退出当前的 shell 进程¹。在
$(resolve_ip)
,resolve_ip
中运行在一个子shell 进程中。你可以做:
当子shell以非零退出状态退出时,主shell退出(与子shell具有相同的退出代码)。
此外,
resolve_ip
在子shell 环境中运行时,$ip
and$host
变量在子shell 返回后将无法生存。另请注意,
(...)
in(>&2 echo "Error: $1")
还启动了一个子shell。除非您想涵盖 stderr 是一个损坏的管道并且写入错误消息会导致 SIGPIPE 传递到echo
内置的主 shell 进程的情况,否则这里并不是真正需要的。在这里,您可以通过将输出存储在用户提供的变量中来返回它,而不是通过标准输出返回输出:
¹ 严格来说,子shell 环境不必使用子进程来实现,并且某些shell 就像
ksh93
不作为优化,但仍然exit
只退出子shell,而不是主shell。ksh93
但是有一个${ ...; }
不涉及子shell环境的表单或命令替换,因此exit
会退出主shell。