在 Bash 脚本中 set -e
Nilesh Katuwal
2023年1月30日
如果命令返回非零退出状态,set -e
选项指示 shell 退出。简单来说,shell 在命令失败时退出。
在 Debian 包管理脚本中,set -e
也称为 set -o errexit
。根据 Debian 政策,在某些脚本中需要使用此选项;目标似乎是避免出现任何未处理的错误情况。
实际上,这意味着你必须了解你运行的命令可能返回错误的情况并明确解决每个问题。
在 Bash 的函数体之外使用 set -e
让我们编写一个 Bash 脚本来使用 hello_world
函数打印 Hello World
。我们将在函数之外使用 set -e
。
set -e
仅用于编写或设置错误显示代码。
#!/bin/bash
set -e
function hello_world()
{
echo "Hello World!"
}
hello_world
输出:
Hello World!
在 Bash 的函数体内使用 set -e
现在,我们将把 set -e
放在上述脚本的函数中。
#!/bin/bash
function hello_world()
{
set -e
echo "Hello World!"
}
hello_world
输出:
Hello World!
在函数内部或外部使用 set-e
不会影响我们的输出。
set -e
和 trap
set -e
命令指示终端在检测到错误时抛出异常,从而导致代码停止执行。trap
关键字允许你使用内置函数 ERR
,它接受错误行号并将其传递给错误函数。
让我们看一个例子。
#!/bin/bash
set -e
function error()
{
echo "error at $1"
}
trap 'error $LINENO' ERR
errors
我们创建了一个函数 error
并使用 shell 变量 $1
来存储发生错误的行号。
输出:
demo.sh: line 9: errors: command not found
error at 9
demo.sh
是包含上述脚本的脚本文件的名称。
如果脚本的一行失败,但最后一行成功,则整个脚本被认为是成功的。因此,很容易忽略错误。
容错在脚本中要好得多,而 set -e
为你提供了这一点。