如何避免和恢复 shell 命令历史记录中不可打印字符的意外入侵?

如何避免和恢复 shell 命令历史记录中不可打印字符的意外入侵?
$ history
...
  242  yum whatprovides */bin/xdotool
  243  yum provides */bin/xdotool
  244  yum provides xdotool
  245  yum whatprovides xdotool
  246  yum whatprovides xdotool

根据提示:

up

[root@localhost Downloads]# yum whatprovides xdotool

up

[root@localhost Downloads]# yum whatprovidesxdotool

up

[root@localhost Downloads]# yumtprovidesxdotool

up

[root@localhost Downloads]# yumtprovides*/bin/xdotool

up

[root@localhost Downloads]# yumwhattprovides*/bin/xdotool

请注意,在第一个调用的命令中,有一个不可打印的字符,我用(unicode 框字符)表示,该字符在我的终端中不可见,并且不占用字符空间。在我的终端中我看到这个:

yum whatprovides xdotool

不是这个:

yum whatprovides ☐xdotool

使用cat -A

$ history | cat -A
...
 246  yum whatprovides M-BM-^Vxdotool $

我在 Windows 10 上运行 Cygwin,mintty并通过 shell 连接到 Fedora 29。

我正在使用系统默认值。

$ echo $PS1
[\u@\h \W]\$

我认为这与:

https://unix.stackexchange.com/a/31643/81989

当它在 PS1 中时,bash 会计算打印的字符数,以便在您滚动历史记录时可以正确重画。这就是 bash 有 [ 和 ] 特殊字符的原因——它们告诉 bash 所包含的字符不可打印,这有助于 bash 弄清楚如何在必要时重绘提示符。

我相信我的历史中这个不可打印的字符是导致它出错的原因。

我有兴趣了解这是如何以及为何发生的,但我也想知道:

  • 有哪些可用选项或可以在不清除我的历史记录的情况下进行恢复
  • Bash 是否可以配置为从命令历史记录中丢弃这些字符,以避免将来发生这种情况?
  • 有没有办法识别出有问题的角色是什么?

顺便说一句,在命令历史记录中保留这些不可打印字符有什么好处?每当我遇到这个问题时,总是很麻烦。

相关内容