ksh中的进程替换等效(修改stdout)

时间:2016-09-21 21:21:20

标签: bash shell ksh

我有这个bash脚本为日志文件的每个条目添加时间戳,但我坚持将其转换为korn shell语法。我读过korn shell并不喜欢subshel​​l。我试图利用功能但是没有用。特别是,我尝试将整个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'

2 个答案:

答案 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