不可见的终端输出打破了脚本

时间:2014-07-24 11:16:20

标签: linux bash special-characters

这是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

我的下一个问题是,如何忽略循环中的任何不可见/特殊输出?(并且只获取我最终会在终端中看到的字符)

1 个答案:

答案 0 :(得分:1)

您可以尝试使用特殊参数扩展删除这些字符:

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

尝试运行echo -n "$line" | hexdump -C以查看这些字符的十六进制值。

然后你可以做类似

的事情
$'\x01\x02abc'

注意:

  • Bash分别用\[\]替换PS1中的$'\x01'$'\x02',但我不确定它们是否按实际输出发送。
  • $'\x##'是十六进制形式,$'\000'是八位形式。