退出不终止脚本

克拉克

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是在subshel​​l进程中运行。

你可以做:

my_ip=$(resolve_ip) || exit
master_ip=$(resolve_ip "$hostname") || exit
if [ "$my_ip" = "$master_ip" ]; ...

当子shell以非零退出状态退出时,使主shell退出(具有与子shell相同的退出代码)。

同样,就像resolve_ip在子shell环境中运行一样,$ipand$host变量在该子shell返回后将无法生存。

还要注意,(...)in(>&2 echo "Error: $1")还启动了一个子shell。除非您想解决stderr是坏管道的情况,否则在这里并没有必要,并且如果写入错误消息将导致SIGPIPE传递到echo内置的主shell进程中

在这里,您可以通过将其存储在用户提供的变量中来返回输出,而不是通过stdout返回输出:

resolve_ip (){ # args: ip_var [host]
    if [ "$#" -eq 1 ]; then
        host=localhost
        eval "$1="'$(dig +short myip.opendns.com @resolver1.opendns.com)'
    else
        host=$2
        eval "$1="'$(dig +short "$2")'
    fi

    if eval '[ -z "${'"$1"'}" ]'; then
        error "Could not resolve $host"
    fi
}

# ...

resolve_ip my_ip
resolve_ip master_ip "$hostname"

if [ "$my_ip" = "$master_ip" ]; ...

¹严格来说,子外壳环境不必使用子进程来实现,有些外壳诸如此类ksh93并不是为了优化,但仍然exit仅存在子外壳,而不是主外壳。ksh93但是具有${ ...; }不涉及子shell环境形式或命令替换,因此exit将退出主shell。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“中断”不终止脚本python

来自分类Dev

终止从退出的bash脚本提交的作业

来自分类Dev

&&返回1是否不终止脚本?

来自分类Dev

使用Ctrl-C终止程序而不终止父脚本

来自分类Dev

使用Ctrl-C终止程序而不终止父脚本

来自分类Dev

我如何防止脚本在shell退出时终止?

来自分类Dev

在不终止python进程的情况下停止python脚本

来自分类Dev

如何在不终止的情况下运行bash脚本

来自分类Dev

如何在不终止的情况下运行bash脚本

来自分类Dev

如何在不终止当前执行的行的情况下终止shell脚本

来自分类Dev

Shell脚本在失败时不记录Java退出状态

来自分类Dev

Shell脚本在失败时不记录Java退出状态

来自分类Dev

设置-e时,Posix Shell测试非零退出代码脚本终止

来自分类Dev

从脚本退出

来自分类Dev

对bash脚本执行ping操作,如果不执行ping操作,则退出脚本

来自分类Dev

获取终止进程的退出代码

来自分类Dev

退出vbscript终止前台线程

来自分类Dev

模拟以退出代码终止:139

来自分类Dev

在Python调试器pdb中,如何在不终止调试会话的情况下退出交互模式

来自分类Dev

强制终止python脚本

来自分类Dev

终止IronPython脚本

来自分类Dev

强制终止脚本

来自分类Dev

定时循环不终止

来自分类Dev

MailboxProcessor不终止

来自分类Dev

xdotool不终止

来自分类Dev

字符不终止而循环

来自分类Dev

文件名扩展不匹配任何文件是否会导致脚本以1退出?

来自分类Dev

如何在不添加`||的情况下编写错误中止脚本 退出$?`每行?

来自分类Dev

Ctrl + C进程终止而不终止终端