Windows 终端上的 Ubuntu 在为 Starship 提示符创建别名后挂起

Windows 终端上的 Ubuntu 在为 Starship 提示符创建别名后挂起

发行版:Ubuntu-18.04(在 Windows 10 WSL2 上运行)

我的任何新 Ubuntu 实例的终端都完全冻结,并显示消息“Vim:警告:输出不是到终端”

这是在 VIM 上编辑 .bashrc 文件后发生的,我所做的只是添加一些别名LS命令。当我进入后source .bashrc,上面的消息出现了。我无法按 ctrl+C 或 ctrl+z 执行任何操作,也不会出现允许输入任何命令的提示。

ScreenshotOfTerminal_“Vim:警告:输出不是到终端”

几乎可以肯定我在编辑 .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不是交互式,因此没有附加终端。标准输出(等)不会显示到屏幕上,而是被捕获并由evalshell 进行解释('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预期调用实际命令。另请参阅运行由别名隐藏的命令

相关内容