为什么在ERR陷阱中退出0时bash抑制stdout?

时间:2019-05-21 13:01:50

标签: bash

我正在尝试在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.

1 个答案:

答案 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。这有两件事:导致handleerrorset -e运行之前中止脚本,并且导致echo "$OUTPUT"运行 second 时间。现在,当您运行脚本时,所看到的就是

handleerror

从第二次通话到TEST 的结果。