2016-12-06 191 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