2016-12-06 87 views
0

假设下面的简单脚本:防止记录

#!/bin/bash 
log="${HOME}/bin/test.log" 
if [ -r "${log}" ]; then 
    rm -f "${log}" 
fi 
{ 
    echo "Start of test" 
    clear 
    echo "End of test" 
} 2>&1 | tee -a "${log}" 

生成的日志文件的内容如下所示:

Start of test 
<unprintable>[H<unprintable>[2JEnd of test 

有什么办法避免多余的字符导致从使用这种记录方式发出明确命令?

回答

1

一种可能性是将它们从流转到日志文件的流中过滤掉。

{ 
    echo "Start of test" 
    clear 
    echo "End of test" 
} 2>&1 | tee -a >(sed 's/.\[H.\[2J//' > "${log}") 

(我不知道如何单独使用便携式sed匹配文字转义字符。在这里,我只是用.匹配任何字符,并假设这个正则表达式将只匹配预期序列。人们可以“欺骗”,并使用bash产生的sed命令文字转义字符:

sed $'s/\e\\[H\e\\[2J//' 

虽然,因为我们已经使用bash特异性进程替换它不是作弊太多)

+0

这很好,但有一个奇怪的副作用,其中诸如echo“Only in log”>>“$ {log}”之类的语句对日志没有影响。任何解决方案? – Frostfyre

+0

你可能会对运用'>>'和'sed'命令有一些好运,但通常这可能不起作用,因为你现在有两个独立的进程(脚本和'sed')编写同一个文件,并且写入将被任意交错。 – chepner

+0

我每次使用clear命令时都使用sed清除日志中的字符,但感谢您的帮助。 – Frostfyre