插入二进制文件后,哈希符号(#)转换为英镑符号(£)


42

这就是我的bash提示过去的样子。

旧的bash提示

然后我做了一些可能不太聪明的事情,我做了cat /bin/bash。现在我的bash提示符看起来像这样,用井号(£)代替了井号(#)。它甚至会影响文件中的哈希符号,请参见此处:

文件中的英镑符号

任何想法如何还原此?

编辑:此问题不会询问“如何更改我的bash提示?”,而是“我的bash提示本身已更改,如何恢复它?”

.bashrc为那些有兴趣的人完成



1
(我
随意

9
提示,文件等仍然包含的字符代码#\x23; 只是终端现在解释\x23£
deltab'8

4
有趣的是,“磅”是美国(可能还有其他国籍?)英语中井号符号的另一种称呼……=)
jpmc26

1
这是在什么终端程序中完成的?
SnoringFrog

Answers:


102

终端接受并执行一堆不同的字符序列作为控制命令。例如,所有光标移动都使用这些完成。有些代码会进行永久性更改,例如设置颜色或告诉终端使用备用字符集。可执行文件和其他二进制文件可以很好地包含代表这些命令的字节,因此将二进制文件转储到终端会产生恼人的副作用。有关某些控制代码,请参见此处

这样做的历史背景是,最初,终端是带屏幕和键盘的笨拙设备,它们通过串行端口连接到实际计算机。在此之前,他们是带有键盘的打印机。没有什么协议可以将数据字节与命令字节分开,因此命令被分配给终端“内联”。(或者更确切地说,转义码和控制字符是协议。)人们可能会认为,如果今天设计了该系统,则数据和命令之间的分隔会更加清晰。

您不仅可以关闭终端窗口或杀死仿真器,还可以使用resetcommand,该命令发送一个(或多个)类似的命令将终端重置为默认的默认设置。

我不知道到底是什么会导致哈希变化。(但是@ Random832确实,请参见他们的答案。)我对“替代字符集”更为熟悉,该字符集可以将所有字符更改为画线的字形。即使发生这种情况,键盘输入通常也不会改变,因此resetEnter即使字符显示为垃圾字符或根本不显示字符,书写仍然可以进行。(与您的提示变成一串提示相比,您的影响很小。)


1
感谢您的详细说明。只要有必要的声誉,我将立即投票。
lhermann '16

2
当我第一次cat /dev/urandom在Debian安装控制台中尝试时(考虑到使砖砌硬件成为现实的屏幕分辨率),我以为触发了溢出,并迅速导航到“放弃所有更改,重新启动机器”按钮。现在,我知道这是一个“预期功能”。
wizzwizz4

2
这是历史悠久的功能,现在不受欢迎。一些(都不错)的终端仿真器在UTF-8环境中运行时应禁用旧式字符集开关转义符,但是它们是否这样做以及如何激活该选项(如果不是默认选项)则文献记载不充分,并且不同。
R.,

78

作为记录,回答为什么发生这种情况以及如何在不关闭终端的情况下进行修复(如果reset失败):

作为正在仿真的VT220终端的一个功能,许多终端都支持许多基于ISO 646ISO 2022国家替换字符集。特别是,由于某些原因,即使不支持其他原因,这也很常见,因为它们支持英国字符集,该字符集的英镑货币符号与ASCII具有数字符号的位置相同。

因此,当您在终端上打印一个二进制文件时,它会巧合地将序列ESC ( A[或也许ESC ) A^N] 输出到终端。可以通过打印将其设置为正常状态的序列来手动撤消此操作:

printf '\e(B\e)0\x0f'

我在不知道细节的情况下猜测了这样的事情。谢谢你的解释。周围有像你这样的人真是太好了!
lhermann '16

1
哦,亲爱的,海鸥代替了Ä和Ö。。。OS X上的Terminal甚至在2016年也支持这种替换。
ilkkachu 2016年

@ilkkachu某些支持它们的终端(我知道Putty,我也认为Linux控制台)在使用UTF-8时会拒绝它们,因为ISO 2022表示ESC % @处于该状态时不支持其他序列(除外)。用于支持UTF-8。因此,随着更多的应用程序被迫使用UTF-8进行线条绘制,它们可能最终消失[这是该功能最广泛使用的实际用法,主要包含其他字符集,因为当您实现该机制时,它是“免费的” ]。
2016年

20
容易记住这些转义序列:“ A”代表英国,“ B”代表“美国人”:D
egmont

8
我发现了@egmont,事实证明,它们是按照在ISO中注册的顺序依次分配的。在第一个是旧的国际参考版本[与¤用于$]为@,然后英国版发生在美国的人之前就搞定了。itscj.ipsj.or.jp/itscj_english/index.html,以获取所有列表。
Random832

30

关闭终端并打开一个新终端。


19
你不应该 这个问题是有效的。也许有人会详细解释为什么会这样。这一定是Bash中的一个漏洞。£作为同项下坐在#只有这就是所谓的用Alt。不知何故Alt住在巴什。无论如何,您可以等待适当的解释,或者对我的回答满意,请单击检查以接受它。
Tomasz

1
或者不是在Bash中,而是在终端程序中。我在GUI外部的命令行上尝试了相同的操作,它会永远循环。
Tomasz

5
@Xalorous,问题指出,问题出现时,他cat/bin/bash到终端。
ilkkachu 2016年

2
Random832很好地解释了实际发生的情况
lhermann '16

16
这太过分了-如果您要保留会话中的某些状态,该怎么办?如果它是控制台而不是X终端怎么办? reset是完成这项工作的正确工具。
pericynthion


9

stty sane似乎也能解决问题reset


7

无需关闭,重新打开或重置终端!虽然重置将起作用,但这不是正确的方法!

您只需要清除/擦除终端回滚缓冲区。为此,只需使用以下命令:

$ echo -ne '\0033\0143'

1
您对此奇迹有解释吗?
Tomasz

1
@tomas是的,可以肯定。当-e生效时,它会通过运行能认出你可以阅读一些序列man echo,其中之一是\0NNN它代表与八进制值NNN字节。实际上,您不需要重置终端会话,只需要清除回滚缓冲区即可。我说的命令将完成所需的工作。例如,如果您使用的是MacOS X,则在使用终端时在菜单栏中有一个“编辑”,并且有一个选项“清除回滚或⌥⌘K”。
FarazX

5
顺序\033\143为ESC c,重置为初始状态:“将VT100重置为其初始状态,即开机后的状态。这也会导致执行开机自检,并向INIT H发送信号简短地断言。”
deltab'8

1
@deltab我忘了提及ESC,感谢百万同伴。
FarazX

1
@tomas每当您尝试显示不应显示的文件时(例如二进制文件),终端都会表现得奇怪而笨拙。许多Linux用户都进行了重置,但这并不是最好的选择,因为不需要重置终端会话,并且需要清除回滚缓冲区。
FarazX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.