Gle*_*enn 8 bash logs shell-script exec
我正在尝试整理以下片段,设计目标是记录脚本的所有输出,而不应该是包装器。线越少越好。
我不关心用户输入(在这个阶段),目标脚本以非交互方式运行。
片段需要
目前,我有以下内容仅在最新版本的 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}
Run Code Online (Sandbox Code Playgroud)
那么这...
# 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
}
Run Code Online (Sandbox Code Playgroud)
而不是echo我可以调用这些 msg 过程之一,例如,msg_con "hello world"。
此外,脚本输出将通过在调用时设置为环境变量而转到 stderr,例如, DEBUG_TEST=true myscript.
我读过 exec 可能无法在某些 shell 中工作,例如 busybox。/sf/answers/364052811/上有一个 mkfifo 和 fork 组合,可以做类似的事情,但除非绝对需要,否则我宁愿不使用 fork。
请更喜欢 bash 示例,但是在 sh 下工作或更便携的东西会很好。有任何想法吗?
function startLogging {
exec > >(gawk -v pid=$$ '{ print strftime("%F-%T"),pid,$0; fflush(); }' | tee -a $logfile)
[ ! -z "$DEBUG" ] && exec 2>&1 || exec 2> >(gawk -v pid=$$ '{ print strftime("%F-%T"),pid,$0; fflush(); }' >>$logfile)
echo "=== Log started for $$ at $(date +%F-%T) ==="
}
Run Code Online (Sandbox Code Playgroud)
您需要将 $logfile 设置为某些内容