对二进制文件进行分类后哈希符号 (#) 变成了英镑符号 (£)

lhe*_*ann 46 terminal

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

旧的 bash 提示

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

文件中的磅符号

任何想法如何恢复这个?

编辑:此问题不问“如何更改我的 bash 提示?”,而是“我的 bash 提示自行更改,我该如何恢复?”

.bashrc对有兴趣的人来说是完整的。

ilk*_*chu 106

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

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

您可以使用resetcommand,而不是仅仅关闭终端窗口或终止模拟器,它会发送一个(或多个)类似的命令来将终端重置为正常的默认值。

我不知道究竟是什么会导致哈希改变。(但@Random832 确实如此,请参阅他们的答案。)我更熟悉“替代字符集”,它可以将所有字符更改为画线字形。即使发生这种情况,来自键盘的输入通常会保持不变,因此resetEnter即使字符显示为垃圾或根本不显示,书写仍然有效。(与你的提示变成一堆行相比,你只得到了很小的影响。)

  • 这是历史上预期的功能,现在不受欢迎。在 UTF-8 环境中运行时,一些(一切都很好)终端仿真器应该禁用旧的字符集开关转义,但是它们是否这样做,以及如果它不是默认选项,你如何激活这样做的选项,文档很差,并且各不相同。 (3认同)
  • 当我第一次在 Debian 安装控制台中尝试 `cat /dev/urandom` 时(让我想起砖块硬件的屏幕分辨率),我以为我触发了溢出,并迅速导航到“放弃所有更改,重新启动机器” “ 按钮。现在我知道这是一个“预期功能”。 (2认同)

Ran*_*832 80

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

许多终端支持,作为他们模拟的VT220终端的一个特性,基于ISO 646ISO 2022的许多国家替换字符集。特别是,出于某种原因,即使不支持其他人,他们也支持英国字符集是很常见的,其中英镑货币符号与 ASCII 具有数字符号的位置相同。

因此,当您将二进制文件打印到终端时,它出于某种巧合将序列ESC ( A[或者可能ESC ) A^N]输出到终端。这可以通过打印将其设置为正常状态的序列来手动撤消:

printf '\e(B\e)0\x0f'
Run Code Online (Sandbox Code Playgroud)

  • 很容易记住这些转义序列:“A”代表英国,“B”代表“美国”:D (20认同)
  • @egmont 我对此进行了深入研究,事实证明,它们是按照在 ISO 中注册的顺序依次分配的。_first_是旧的国际参考版本[用`¤`表示`$`]是@,然后英国版本恰好在美国版本之前进入。https://www.itscj.ipsj.or.jp/itscj_english/index.html 查看所有列表。 (8认同)

小智 29

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

  • 你不应该。这个问题是有效的。也许有人会详细解释为什么会发生这种情况。这一定是 Bash 的一个漏洞。`£` 与 `#` 位于相同的键下,只是它用 `Alt` 调用。不知何故,“Alt”留在了 Bash 中。无论如何,您可以等待适当的解释,或者如果您对我的回答感到满意,请单击检查以接受它。 (19认同)
  • 这是矫枉过正 - 如果您想保留会话中的某些状态怎么办?如果它是控制台而不是 X 终端呢?`reset` 是适合这项工作的工具。 (16认同)
  • @Xalorous,问题说明问题出现在他将“/bin/bash”“cat”到终端时。 (5认同)
  • Random832 很好地解释了实际发生的事情 (2认同)

use*_*494 17

只需reset在您的会话中执行。


cat*_*cat 10

stty sane似乎也解决了这个问题reset


小智 7

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

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

$ echo -ne '\0033\0143'
Run Code Online (Sandbox Code Playgroud)

  • 序列`\033\143`是ESC c, [Reset to Initial State](http://vt100.net/docs/vt100-ug/chapter3.html#RIS):“将VT100重置为初始状态,即,它在上电后的状态。这也会导致上电自检的执行和信号 INIT H 被短暂断言。” (5认同)
  • @tomas 每当您尝试显示不应该显示的文件时 - 例如二进制文件 - 终端会表现得奇怪而笨拙。许多 Linux 用户都进行了重置,但这不是最好的选择,因为不需要重置终端会话,并且只需要清除回滚缓冲区。 (2认同)