【发布时间】:2014-06-23 22:43:53
【问题描述】:
我的目标是为我的 ssh 会话中使用的命令制作一个带时间戳的日志。
只要输出未被过滤,Tee 就会实时工作。当我 tail -F test.log 时,以下命令会实时追加输出:
#!/bin/bash
ssh "$@" | tee -a test.log
但是,当我尝试通过this question 中建议的方法修改 tee 的输出时,输出不再是实时的。例如:
#!/bin/bash
ssh "$@" | tee >(grep -e '.*\@.*\:.*\$.*' --color=never >> test.log)
奇怪的是,如果我用“yes”命令代替 ssh 命令,输出会被实时正确过滤。
实时处理很重要,因为我的脚本需要将当前时间戳附加到每一行并尽可能多地删除输出。到目前为止,这是我的脚本:
#!/bin/bash
logfile=~/test.log
desc="sshlog ${@}"
tab="\t"
format_line() {
while IFS= read -r line; do
echo "$(date +"%Y-%m-%d %H:%M:%S %z")${tab}${desc}${tab}${line}"
done
}
echo "[START]" | format_line >> $logfile
ssh "$@" | tee >(grep -e '.*\@.*\:.*\$.*' --color=never | format_line >> $logfile)
echo "[END]" | format_line >> $logfile
我该如何解决这个问题,为什么 ssh 命令对 tee 的作用与 yes 命令不同?
【问题讨论】: