繁体   English   中英

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

[英]Why does bash suppress stdout when exit 0 in ERR trap?

我正在尝试在bash中设置一个ERR陷阱并注意到一些奇怪的行为。 如果退出代码为0 ,当我运行此脚本时,Bash似乎不会将我的echo命令输出到控制台,但是,如果退出代码非零,则输出文本。 这是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.

简答:输出没有被抑制; 它被命令替换捕获。 更改handleerror的退出状态handleerror更改它被调用的次数:一次在命令替换内,一次在外部 运行bash -x testing.sh来查看差异。


您必须考虑何时实际调用handlerror mkdir的失败会触发调用,并且由于在命令替换中调用了handleerror ,因此会捕获其输出并将其分配给OUTPUT 如果你在脚本的末尾添加echo "$OUTPUT" ,你会看到

mkdir: test: No such file or directory
TEST

作为脚本的输出。 执行此行是因为handleerror的0退出状态阻止set -e提前退出脚本。

现在,将exit 0更改为exit 1 序列开始相同: mkdir失败, handleerror ,并通过命令替换捕获其输出。 但是,现在handleerror本身的退出状态为1,这使得命令替换的退出状态以及赋值语句1也是如此。 这样做有两件事:它导致set -eecho "$OUTPUT"运行之前中止脚本,并导致handleerror 第二次运行。 现在当你运行脚本时,你所看到的就是

TEST

由第二次调用handleerror

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM