这是here的延续,我将所有输出都捕获到终端。这个脚本在我的机器上运行正常,但在另一个时,我在管道到espeak
时听到了额外的东西,而不是在写入文件或打印时。调试有点痛苦但是经过一些试验和错误,我认为将其缩小到~/.bashrc
- > /etc/bashrc
- > /etc/profiles.d/vte.sh
做一些我认为是设置PROMPT_COMMAND="__vte_prompt_command"
。至少我认为是这样,但PROMPT_COMMAND=
在采购vte.sh
之后无法修复。
无论如何,打印出来的一些特殊字符会改变窗口标题(printf "\033]0;%s@%s:%s\007%s"...
可能?)。在写入文件或在终端中作为输出时,这些字符不会出现,但在管道到espeak
等应用程序时会出现。
我的第一个问题是,我应该如何检测到这些特殊字符的存在?(我只通过反复试验找到了vte
,这看起来很慢)
while read line
do
espeak "$line" #can hear extra stuff
echo "GOT: [$line]" #only expected output printed
done <input_pipe
我的下一个问题是,如何忽略循环中的任何不可见/特殊输出?(并且只获取我最终会在终端中看到的字符)
答案 0 :(得分:1)
您可以尝试使用特殊参数扩展删除这些字符:
line=${line//stringtodelete}
line=${line//[charstodelete]}
尝试运行echo -n "$line" | hexdump -C
以查看这些字符的十六进制值。
然后你可以做类似
的事情$'\x01\x02abc'
注意:
\[
和\]
替换PS1
中的$'\x01'
和$'\x02'
,但我不确定它们是否按实际输出发送。 $'\x##'
是十六进制形式,$'\000'
是八位形式。