Bash shell 在返回时不开始新行,也不显示键入的命令

Tim*_*Tim 13 less bash

在 lxterminal 窗口中运行的交互式 bash shell 中,我不知道我搞砸了什么。

键入 Return 键不会开始新行,但 Ctrl-C 会。

$ ^C
$ $ $ $ $ ^C
$ ^C
$ $ $ $ $ $ $ 
Run Code Online (Sandbox Code Playgroud)

当我输入命令时,虽然按回车键会执行它,但输入的命令是不可见的。

在这之前,我正在运行一些命令sudo lsof ... | less(或sudo netstat ... | less),但似乎没有输出,所以我以任意顺序多次按 ctrl-c 和/或 q。当我终于退出时less, bash 的问题发生了。

我是否不小心将 shell 的 stdout 重定向到了其他地方?

有没有办法在不关闭我的外壳的情况下解决问题?

use*_*709 23

我认为您的终端可能陷入了“有趣”模式。您可能可以使用该/usr/bin/reset命令重置它,该命令通常与ncurses库一起提供。

  • 像“less”这样的命令以与大多数命令不同的方式使用终端。为了完成他们的工作,他们向终端发送控制代码和转义序列以更改其模式。当它们完成时,它应该返回,但是如果你杀死 `less` 而没有机会运行重置代码,那么你最终会到达你所在的位置。Ctrl-C 应该发送一个 sig int,这应该被捕获,并在退出之前运行重置代码。发送 sig kill 或 `less` 中的错误可能会导致问题。 (7认同)
  • 请注意,有时终端会卡住,因此 RETURN 键无法按预期工作。在这种情况下,control-J (^J) 可能会起作用;例如`^Jreset^J` (2认同)

Ral*_*alf 11

如果reset(在另一个答案中提出)不起作用,请尝试:

stty sane
Run Code Online (Sandbox Code Playgroud)

也许紧随其后

tput rs1
Run Code Online (Sandbox Code Playgroud)

我定义了以下别名(我猜我是在 stackoverflow 的某个地方捡到的):

alias   fixtty='reset; stty sane; tput rs1; clear; echo -e "\033c"'
Run Code Online (Sandbox Code Playgroud)


小智 8

正如其他答案所暗示的那样,最简单的修复就是运行reset.

至于原因呢?当您cat(或以其他方式输出)二进制文件或数据到终端时,通常会发生这种情况。

文本只是文本,终端不会对其进行特殊处理,但也有一些特殊字符不是文本,用于执行诸如移动光标、清除屏幕、更改颜色、停止回显输出等操作.

当您输出二进制数据(而不是文本)时,终端会看到这些特殊的控制字符,并在它们出现时尝试解释它们。您可能会注意到屏幕清除、闪烁或跳跃——这都是由于这些控制字符受到尊重。您可以通过head /dev/urandom在新终端中运行来进行实验以了解我的意思。

大多数情况下,如果您的终端在任何情况下都表现reset得很奇怪,只需运行即可修复它,只需回显将终端设置为基本默认模式所需的所有特殊字符 - 例如,有stop echoing input代码和start echoing input代码。二进制数据随机包含了前者,这就是为什么您看不到您的输入内容的原因,并且reset将包含后者(以及其他),这将修复它。