我有这个bash脚本为日志文件的每个条目添加时间戳,但我坚持将其转换为korn shell语法。我读过korn shell并不喜欢subshell。我试图利用功能但是没有用。特别是,我尝试将整个exec
行转换为korn语法。有人可以看看并帮助我吗?
#!/usr/bin/bash
exec > >(
while read line ; do
echo "$(date '+%Y%m%d %H:%M:%S') ${line}"
done > n.log
) 2>&1
echo 'first line; should have an initial timestamp'
sleep 2
echo 'printed two seconds later, should have a timestamp with a comparable offset'
答案 0 :(得分:1)
便携式产品 - 适用于任何符合POSIX标准的外壳 - 是使用命名的FIFO。
此处,最近bash中也提供了ksh扩展名(printf %()T
),以避免需要在子shell中启动date
。
mkfifo log.fifo
(while IFS= read -r line; do
printf '%(%Y%m%d %H:%M:%S)T '
printf '%s\n' "$line"
done >n.log <log.fifo) &
exec >log.fifo
答案 1 :(得分:0)
Charles&#39;优秀的答案:让它更明确 通过为输出修改和主要功能代码创建单独的函数;没有命名的管道,在你完成后没有什么可以清理的。
print_with_timestamps() {
(while IFS= read -r line; do
printf '%(%Y%m%d %H:%M:%S)T '
printf '%s\n' "$line"
done
) > n.log 2>&1
}
main() {
echo 'first line; should have an initial timestamp'
sleep 2
echo 'printed two seconds later, should have a timestamp with a comparable offset'
}
main | print_with_timestamps