我有以下函数来对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 -e
、trap ... 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 使用不同的颜色”。