Bash中的Set -e有什么作用?

178 阅读3分钟

Set -e是在Bash中使用的,当查询退出的时候,如果有一个非零的状态,可以立即停止执行。当你需要知道运行代码中的错误位置时,也可以使用这个功能。让我们继续这篇文章,阐述 "set -e "在代码的不同方面的概念。

在Linux中安装Bash扩展。如果已经安装,那么你需要升级版本,因为版本必须在4以上。

例1

在这里,我们需要一个有Bash代码的文件。所以,通过Ubuntu终端,用 "touch "命令创建一个文件。具体写法是

$ touch file1.sh

在这里我们将采取两种方法。一种是在函数体外使用 "set -e",另一种是在函数内使用。考虑一个文件 "file1.sh"。我们需要这个文件的扩展名是.sh,因为我们要用Bash语言编写代码。这个例子涉及到添加一个名为 "helo "的函数。

在这个函数中,我们想打印一行,所以我们在这里使用echo命令来显示信息。由于我们在这里声明了一个函数,所以这里必须要有函数调用。所以在最后,我们使用了函数的名称作为函数调用。在这里,"set -e "被用在函数主体之外的开始部分。

Set –e

设置-e只是涉及到编写或设置一个显示错误的代码。

我们使用了一个简单的文本编辑器,它在Ubuntu系统中是默认存在的。

$ bash file1.sh

现在,转向第二种方法,我们必须在函数中使用 "set -e"。我们将看到这些方法之间的区别。编辑给定的代码,将 "set -e "从函数主体之外替换到 "helo "函数主体之内,而其余的代码则与前者相同。你可以从插入的图片中查看。

在终端上再次运行相同的命令以得到结果。

这意味着 "set -e "在函数体内部或外部使用时不会引起任何变化。

例2

这是一个非常简单的例子,在文件中声明bash扩展后,我们在函数的外部使用了 "set -e"。set -e "允许终端在发现错误时抛出一个异常,然后代码停止执行。然后,错误函数在这里被声明。这个函数的唯一目的是显示错误信息,以及包含错误的行号。

在这个例子中,有一个特别的地方,就是使用了 "陷阱 "关键字。这个关键字允许使用一个内置函数ERR,该函数获取错误的行号,然后将其传递给错误函数。为了达到识别和显示错误的目的,我们需要添加一个bash中没有的语句或变量,或者使用一些有意义的行来改变语法值。

Trap “Error $LINENOE’ ERR

根据这段代码,结果必须显示第10行的错误。

通过使用文件在终端上执行该代码。你可以联系到,文件名与行号一起显示,并抛出一个异常,显示没有找到该命令。其次,有一个函数的信息来描述发生错误的行号。

例3

这个例子涉及到使用两个bash文件。一个是file1.sh,另一个是file2.sh。首先考虑file2.sh。这里我们使用了 "set -e",在另一个文件中没有使用。同样,在这个文件中,我们只使用了函数调用,而整个函数体是在另一个文件中声明的。我们通过使用关键字 "source "来链接这两个文件,这样我们在这里进行的函数调用就能够执行另一个文件中的函数。

4 Source “file1.sh”

之后,在函数调用中,还显示了一个词。

EchoNotification: $(helo)”

"Helo "是该函数的名称。

现在,考虑另一个文件file1.sh。在这个文件中,helo1()函数被声明。在函数主体中,我们只显示了一条信息。

Echo “wait: $1

向另一个函数发展,即helo()。这也是我们讨论的第一个文件中被调用的同一个函数。在这个函数中,我们再次使用了helo1()的函数调用。在同一个文件中,这个函数被声明在当前函数之上,所以我们不需要通过使用 "source "关键字来链接两个文件。随着函数的调用,会显示一条信息。

Helo1 “there exists an error”

整个性能是这样完成的,我们将在终端运行file2.sh。因此,第一个函数调用将被执行,控制将移向file1.sh中的helo()函数。这将执行这个函数调用,现在控制将移向文件的第一个函数。让我们看看输出是如何显示的。

$ bash file.sh

现在你可以看到,首先显示的是file2.sh中的单词,然后是函数 "helo1() "的信息,即 "等待",然后是函数helo()的信息。由于我们使用了 "exit 1",控制权并没有交给它,所以没有 "set -e "的作用了。如果函数调用没有被处理,一定会有错误出现。

例4

这个例子包含了对 "set -e "的完整理解。在这个例子中取四个函数。我们知道,内置的set -e是用来在获得非零状态时退出代码的。在这个例子中,我们只对一个函数使用了 "0",这是第一个函数。所有其他函数都返回1。这意味着代码将在第一个函数显示后退出执行。但它不会。这里,我们使用了 "set +e",它与 "set -e "相反。每当 "set -e "强迫代码终止执行时,相反的,只要遇到非零值就会反对它。"set +e "在前两个函数的函数调用前声明,"set -e "在后两个方法的函数调用前声明。

Set +e

现在,前两个函数将被执行。在第二个函数中,由于它是一个非零值,编译器将强制抛出一个错误,但 "set +e "将中和这个值。当第三个函数的时候,两个信息都将通过echo显示出来,但当控制到 "返回1 "的值时,代码将停止。在这里,我们没有使用 "set +e"。这就是为什么第4个函数在这里没有被执行。

在终端执行代码,你就会看到结果值。

总结

本教程展示了 "set -e "的工作原理。在例子中,它就是这样被用来终止执行的。然而,这里也使用了对手 "set +e "来说明其工作。