我正在尝试在bash中设置一个ERR陷阱,并注意到一些奇怪的行为。如果退出代码为echo
,则在运行此脚本时Bash似乎不会将我的0
命令输出到控制台,但是,如果退出代码为非零,则将输出文本。这是bash中的错误吗?还是对此有一些解释?
./ testing.sh:
#!/bin/bash
set -eE
handleerror() {
echo "TEST"
exit 0
}
trap "handleerror" ERR
OUTPUT=$(mkdir test/test 2>&1)
如果我运行上面的脚本,它将不输出任何内容。如果将exit 0
行更改为exit 1
,则会看到以下内容:
> ./testing.sh
TEST
供参考:
> bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
答案 0 :(得分:4)
简短的回答:输出不会被抑制;它是由命令替换捕获的。更改Sub Totals()
Dim rng As Range, cell As Range
Dim Supertotal As Long
Dim Subtotal As Long
Dim Ptotal As Long
Set rng = Range("F2:F32")
Supertotal = 0
Subtotal = 0
Ptotal = 0
For Each cell In rng
If ActiveCell.Offset(0, -4).Interior.ColorIndex = 6 Then
Supertotal = Supertotal + 1
ElseIf ActiveCell.Offset(0, -4).Style = "Note" Then
Subtotal = Subtotal + 1
Else
Ptotal = Ptotal + 1
End If
Next cell
Ptotal = Ptotal - Supertotal - Subtotal
MsgBox "The Total Number of SuperTests is " & Supertotal
MsgBox "The Total Number of SubTests is " & Subtotal
MsgBox "The Total Number of Procedure Tests is " & Ptotal
End Sub
的退出状态会更改其被调用的次数:一次在命令替换内,一次 outside 。运行handleerror
来查看区别。
您必须考虑何时bash -x testing.sh
被实际调用。 handlerror
的失败触发了调用,并且由于在命令替换内调用了mkdir
,因此捕获了其输出并将其分配给handleerror
。如果在脚本的末尾添加OUTPUT
,则会看到
echo "$OUTPUT"
作为脚本的输出。执行此行是因为mkdir: test: No such file or directory
TEST
的0退出状态阻止handleerror
提前退出脚本。
现在,将set -e
更改为exit 0
。序列以相同的顺序开始:exit 1
失败,mkdir
被调用,并且其输出由命令替换捕获。但是,handleerror
本身的退出状态现在为1,这使得命令替换的退出状态以及赋值语句也为1。这有两件事:导致handleerror
在set -e
运行之前中止脚本,并且导致echo "$OUTPUT"
运行 second 时间。现在,当您运行脚本时,所看到的就是
handleerror
从第二次通话到TEST
的结果。