为什么这里会调用 ERR 陷阱?

为什么这里会调用 ERR 陷阱?

我有以下函数来对stderr命令的输出进行着色:

red=`tput setaf 1`

colorerr() {
  (trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)")
}

例如:

colorerr "bash -c 'cd ${WEB_APP_DIR}; npm run-script build'"

该脚本使用set -etrap ... ERR、 和trap ... EXIT来报告失败时的行号和堆栈跟踪。一切工作正常,除非传递的命令字符串colorerr失败,我想捕获错误并提供更好的报告(因为告诉我函数中发生的失败colorerr没有用)。

我尝试了标准|| ...构造,但来自子 shell 内的错误colorerr仍然触发ERR trap.作为测试,我尝试了以下操作:

(trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)") ||
 true

但 ERR 陷阱仍然被触发。为什么没有|| true像通常那样将错误代码设置为“0”?

答案1

不是真正的答案,而是一种解决方法。尝试这个:

col-err() { "$@" 2> >(grep --color .) ; }

语法与colorerr问题中的函数略有不同。为col-err, 做不是引用要运行的命令:

col-err bash -c 'cd ${WEB_APP_DIR}; npm run-script build'

可以在任何地方运行的示例:

col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

由于col-err调用grep,它与变量一起使用$GREP_COLORS。将颜色更改为绿色(ms=01;32下面第一个)仅用于一次:

GREP_COLORS='ms=01;32:mc=01;33:sl=:cx=:fn=35:ln=32:bn=32:se=36' \
col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

注:颜色字符串改编自克里基的回答“为每个其他 grep 使用不同的颜色”

相关内容