2014-07-24 76 views
0

這是從here的延續,我將所有輸出捕獲到終端。這個腳本在我的機器上運行良好,但在另一個上,我在管道到espeak時聽到額外的東西,而不是在寫入文件或打印文件時。這對調試來說有點痛苦,但是有一點試驗和錯誤,我認爲將其縮小到~/.bashrc - >/etc/bashrc - >/etc/profiles.d/vte.sh做了一些我認爲設置爲PROMPT_COMMAND="__vte_prompt_command"的事情。至少我認爲這是,但PROMPT_COMMAND=採購vte.sh後不能修復。隱形終端輸出正在破壞腳本

無論如何,它出現了一些特殊字符被打印來改變窗口標題(printf "\033]0;%[email protected]%s:%s\007%s"...也許?)。這些字符在寫入文件或輸出到終端時不會出現,但在管道應用程序(例如espeak)中執行。

我的第一個問題是,我該如何檢測這些特殊字符的存在?

while read line 
do 
    espeak "$line" #can hear extra stuff 
    echo "GOT: [$line]" #only expected output printed 
done <input_pipe 

我的下一個問題是,我怎麼能忽略我的循環任何隱形/特殊輸出(我只有通過試錯,這似乎是相當緩慢的發現vte)?(並只獲得caracters我會在終端最終看到)

回答

1

你可以嘗試用特殊參數擴展刪除這些字符:

line=${line//stringtodelete} 
line=${line//[charstodelete]} 

嘗試運行echo -n "$line" | hexdump -C看到這些字符的十六進制值。

然後,你可以這樣做

$'\x01\x02abc' 

注:

  • 猛砸分別替換\[PS1\]$'\x01'$'\x02',但我不知道他們是否實際發送輸出。
  • $'\x##'是十六進制格式,而$'\000'是十六進制格式。
+0

只是剝離字符不夠健壯。刪除整個「控制」序列[使用正則表達式](http://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output)似乎做了一個漂亮好工作,但我仍然覺得應該有更好的方法。謝謝(你的)信息!尤其是'hexdump'。 – jozxyqk