gpt4 book ai didi

bash - 使用函数中止 bash 脚本

转载 作者:行者123 更新时间:2023-11-29 09:21:26 25 4
gpt4 key购买 nike

我尝试制作一个可以中断脚本执行的函数(由于 fatal error ):

quit() {
echo -e "[ERROR]" | log
exit 1
}

调用示例:

if [ "$#" -eq 1 ]; then
# Do stuff
else
echo -e "function getValue: wrong parameters" | log
quit
fi

函数 quit 被调用(在日志文件中回显)但脚本继续运行。我读过 exit 只终止子 shell(是真的吗?)这意味着它终止了 quit 函数而不是整个脚本。

目前,我不喜欢在 quit 方法中使用返回代码,因为它意味着大量的代码重构。

有没有办法通过 quit 函数停止脚本?

编辑:出现错误的完整示例:

#!/bin/bash

logfile="./testQuit_log"

quit() {
echo "quit" | log
exit 1
}

log() {
read data
echo -e "$data" | tee -a "$logfile"
}


foo() {
if [ "$#" -ne 1 ]; then
echo "foo error" | log
quit
fi
echo "res"
}

rm $logfile

var=`foo p1 p2`
var2=`foo p1`

echo "never echo that!" | log

编辑 2:当我切换这些行时它工作正常:

var=`foo p1 p2`
var2=`foo p1`

var= foo p1 p2
var2= foo p1

有什么解释吗?那是因为子 shell 吗?

最佳答案

正如问题的评论部分所概述的那样,在子 shell 中使用 exit 只会退出子 shell,要解决此限制并不容易。幸运的是,无论如何,退出子 shell 甚至是同一 shell 中的函数都不是最好的主意:

解决在语言的较低级别(如函数或子 shell)处理错误而无异常的一个好模式是返回错误而不是直接从较低级别终止程序:

foo() {
if [ "$#" -ne 1 ]; then
echo "foo error" | log
return 1
else
echo "res"
# return 0 is the default
fi
}

这允许控制流返回到最高级别,即使出现错误,这通常被认为是一件好事(并且将极大地简化复杂程序的调试)。您可以像这样使用您的函数:

var=$( foo p1 p2 ) || exit 1
var2=$( foo p1 ) || exit 1

需要说明的是,如果赋值失败则不会进入||分支(不会),但是如果命令替换中的命令行($( )) 返回非零退出代码。

请注意,$( ) 应该用于命令替换而不是反引号,参见 related question .

关于bash - 使用函数中止 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com