我正在尝试整理以下代码段,设计目标是记录脚本的所有输出,而不应该是包装器。线越少越好。
我不在乎用户输入(在此阶段),目标脚本是非交互式运行的。
该代码段需要
- 输出标准输出到日志,并始终回显到控制台
- 输出stderr记录日志,并回显到控制台,如果已启用调试
- stderr消息应带有时间戳和其他用途
目前,我有以下内容只能在最新版本的bash(4.2+?)下进行测试,例如在Ubuntu精确版中,但是在CentOS6上表现不佳。
DEBUG_LOG="${0##*/}.log"
# copy stdout to log always and echo to console
exec > >(tee -a ${DEBUG_LOG})
# copy stderr to log only, unless debugging is enabled
[ $DEBUG_TEST = "true" ] \
&& exec 2> >(tee -a ${DEBUG_LOG} >&2) \
|| exec 2>> ${DEBUG_LOG}
那这个
# Expand escaped characters, wrap at 70 chars on spaces,
# and indent wrapped lines
msg_log() {
echo -e "$(date +%T) ${0##*/}: $1" \
| fold -w70 -s | sed '2~1s/^/ /' >&2;
}
msg_con() {
if [ "${DEBUG_TEST}" = "true" ]; then
msg_log "$1"
else
echo -e "$1" | fold -w70 -s | sed '2~1s/^/ /';
fi
}
而不是echo
我可以调用这些msg过程之一,例如msg_con "hello world"
。
然后,通过在调用时将其设置为环境变量,脚本输出也将转到stderr DEBUG_TEST=true myscript
。
我已经阅读了exec可能无法在某些shell(例如busybox)中工作。https://stackoverflow.com/a/5200754上有一个mkfifo和fork组合,它的功能类似,但除非绝对需要,否则我不愿使用fork。
请更喜欢bash的示例,但是在sh下工作或更便携的东西会很好。有任何想法吗?