发行版:Ubuntu-18.04(在 Windows 10 WSL2 上运行)
我的任何新 Ubuntu 实例的终端都完全冻结,并显示消息“Vim:警告:输出不是到终端”
这是在 VIM 上编辑 .bashrc 文件后发生的,我所做的只是添加一些别名LS命令。当我进入后source .bashrc
,上面的消息出现了。我无法按 ctrl+C 或 ctrl+z 执行任何操作,也不会出现允许输入任何命令的提示。
几乎可以肯定我在编辑 .bashrc 文件时犯了某种错误,但我什至无法查看该文件,更不用说编辑和执行它了。除了重新安装整个发行版之外,还有其他方法可以解决此问题吗?
编辑 1:我可以通过 Windows 文件资源管理器查看 bashrc 文件。这是其中的一部分:
我编辑的唯一部分是添加一个名为 starship 的新别名,所以只有这部分:
alias starship='vi ~/.config/starship.toml'
对我来说,语法看起来是正确的,所以现在我更困惑为什么会发生这个问题。
编辑 2:终端挂起一段时间后就停止了,现在我可以再次在终端上工作。我其实并没有做什么,只是等待。我猜这个问题与添加别名无关,与 Starship 提示程序有关。
编辑3:给出的答案不是TheDr01ds完美解决了问题。正如所提出的穆鲁,别名肯定首先导致了问题,eval "$(starship init bash)"
由于新别名名为星舰。
答案1
在我看来,这是预期的行为。虽然您最近的编辑表明您重新获得了对终端的控制权,但我的猜测是该错误将在您下次启动 WSL 时再次出现。
这是发生的事情:
当您安装 Starship 时,它会告诉您在 的底部添加以下行
~/.bashrc
:eval "$(starship init bash)"
然后是你重新定义该
starship
命令作为 Bash 中的别名,上面带有:alias starship='vi ~/.config/starship.toml'
结果:
你的最后一行~/.bashrc
被解释为:
eval "$(vi ~/.config/starship.toml init bash)"
如果输入该行,您将看到相同的错误消息,并且终端将再次挂起。发生的事情是vi
在 Bash 命令替换中运行。这是一个子shell不是交互式,因此没有附加终端。标准输出(等)不会显示到屏幕上,而是被捕获并由eval
shell 进行解释('d)。
vi
一旦您获取~/.bashrc
(或重新启动您的外壳),就会运行。知道这一点,你能可能会通过以下方式恢复:
Ctrl+ C Ctrl+C :qEnter:q
这基本上是试图让 Vim 回到可以接受“退出”命令 ( ) 的状态:q。即使您看不到发生了什么,Vim 仍在处理按键。
另一种恢复方法是启动一个新的 PowerShell 终端,然后运行:
wsl ~ -e bash --noprofile --norc
这将启动 WSL(和 Bash)而不处理有问题的进程~/.bashrc
,从而允许您ps auxw
终止有问题的vi
进程,然后编辑您的进程~/.bashrc
来解决问题。
您(至少)有三个潜在的修复方法:
建议:完全删除别名。您会发现像这样的别名并没有那么有用,因为无论如何您都不会经常编辑该文件。使用 Linux 时,您实际上需要编辑数十个(如果不是数百个)配置文件,因此为每个文件设置别名没有多大意义。
如果您想保留别名,请将其重命名,以免与现有命令
edit_my_prompt
或类似命令冲突。或者,将最后一行(调用 Starship)更改为:
eval "$(command starship init bash)"
放在
command
命令之前将导致它忽略别名并按starship
预期调用实际命令。另请参阅运行由别名隐藏的命令。