WSL2 - VSCode的shell命令`code`在Linux终端中不再起作用。

我对Linux和WSL都非常陌生。之前我能够使用code .命令在VSCode中打开我的当前目录,但是在删除了一些我不记得的东西之后,它就再也无法工作了。我输入命令后,它只是卡在那里。
我已经删除了我的Ubuntu-20.04实例并重新创建了它,但仍然无法工作。我还检查了我的$PATH,它似乎是正确的。
此外,VSCode中的add shell command选项没有出现,所以我无法卸载和重新安装shell快捷方式。
有人有任何想法吗?
drewbie@drewbie:/$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Program Files/dotnet/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files (x86)/QuickTime/QTSystem/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/Go/bin:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Users/Andrew/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Program Files/heroku/bin:/mnt/c/Users/Andrew/AppData/Local/GitHubDesktop/bin:/mnt/c/Users/Andrew/go/bin:/snap/bin

After inputing code . it just sits there

在哪里和哪一个

drewbie@drewbie:~$ whereis code
code: /mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/bin/code /mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/bin/code.cmd
drewbie@drewbie:~$ which code
/mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/bin/code

在下面的帖子中按照@NotTheDr01ds所说的做完之后
drewbie@drewbie:~$ vi "$(which code)"
drewbie@drewbie:~$ code .
+ [  = true ]
+ COMMIT=899d46d82c4c95423fb7e10e68eba52050e30ba3
+ APP_NAME=code
+ QUALITY=stable
+ NAME=Code
+ DATAFOLDER=.vscode
+ realpath /mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/bin/code
+ dirname /mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/bin/code
+ dirname /mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/bin
+ VSCODE_PATH=/mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code
+ ELECTRON=/mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/Code.exe
+ IN_WSL=false
+ [ -n Ubuntu-20.04 ]
+ IN_WSL=true
+ [ true = true ]
+ export WSLENV=ELECTRON_RUN_AS_NODE/w:WT_SESSION::WT_PROFILE_ID
+ wslpath -m /mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/resources/app/out/cli.js
+ CLI=C:/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/resources/app/out/cli.js
+ WSL_EXT_ID=ms-vscode-remote.remote-wsl
+ ELECTRON_RUN_AS_NODE=1 /mnt/c/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/Code.exe C:/Users/Andrew/AppData/Local/Programs/Microsoft VS Code/resources/app/out/cli.js --ms-enable-electron-run-as-node --locate-extension ms-vscode-remote.remote-wsl

1你能在VSCode中卸载并重新安装Remote - WSL扩展吗?最坏的情况下,你可以考虑卸载并重新安装VSCode本身吗?通常我不会把"重新安装"作为首选答案,但考虑到(a)你不确定删除了什么,以及(b)重新安装相对快速和无痛苦,我认为这是值得一试的第一步。 - NotTheDr01ds
@NotTheDr01ds 我卸载并重新安装了“Remote - WSL”扩展,但问题仍未解决。我还有些犹豫是否要卸载VSCode。作为最后一招,或许可以考虑。但现在还不行。 - drewkiimon
好的。code实际上是一个shell脚本,所以你可以尝试调试它,看看它在哪里卡住了。使用vi $(which code)命令,在shebang之后的第一行添加set -x。然后尝试运行并将输出添加到问题中。至少我可以将其与我的进行比较。 - NotTheDr01ds
我尝试了你所做的事情,但无济于事。:( 我能够找出它使用的代码和位置。不确定是否需要创建符号链接?有时我见到这样的说法。 - drewkiimon
啊,抱歉,这可能是由于路径中的空格导致的。这是我的错 - 我应该知道要用引号引起来。试试加上引号 - vi "$(which code)" - NotTheDr01ds
@NotTheDr01ds 我弄好了!我把它发布在我的上面的问题中。非常感谢你到目前为止的帮助! - drewkiimon
6个回答

由于接受的答案依赖于副作用并且对我无效,而第二个答案完全不可接受(完全重新安装WSL),所以我继续搜索并找到了一种更安全有效的方法
从StackOverflow中这个旧问题中,由rrmesquita回答:
在WSL终端中,输入rm -r ~/.vscode-server来删除VS Code WSL服务器。 退出终端,然后从PowerShell/Cmd中运行wsl --shutdown。 然后您可以重新登录WSL并运行code .,它应该正常工作。
回答是因为谷歌把我带到了这里,也许这会让其他人的生活更轻松 =)

这个解决了我的VS Code内部终端无法在当前工作目录打开的问题。 - Hassan
1+1 对我来说,这个方法很有效。顺便说一下,code . --verbose 也很有帮助,因为它向我展示了 VS Code 正在卡住的情况,最初我以为每次尝试调用它时它都会悄无声息地退出。 - Darren Beale
1注意:将"/mnt"添加到$PATH中会导致WSL2终端输入延迟较高。 - Halila Saif
在我尝试之前,有人能确认一下,更改文件夹/工作空间会不会导致所有设置丢失吗? - undefined
@TrojanName 如果你担心会弄乱你的东西,你可以尝试使用mv命令而不是rm命令。记得备份哦 =) - undefined
我问这个问题是因为在我的情况下,失去所有的设置是不值得的。无论如何,我可以确认它不会丢失设置,但遗憾的是,在我的情况下它也无法解决问题。代码仍然停在命令上。Ctrl-c可以恢复光标,所以这并不是世界末日,但解决它会很好。 - undefined

我认为这个问题是由VSCode的一个自动更新引起的。
解决方法如下:
  1. 在Windows中打开VSCode
  2. 打开远程资源管理器
  3. 远程资源管理器

  4. 点击感兴趣的WSL目标文件夹:你会发现这会导致一些重新安装
  5. 现在,你可以像以前一样从WSL2的文件夹中使用$ code .命令了

当。我本来想检查一下,但是我决定在另一块硬盘上双启动Linux。如果有人能验证这一点,我会选择它作为答案! - drewkiimon
1@Ando 虽然您已经是成员超过7年了,但是您仍未参观[导览];请务必前往参观。 - mickmackusa
这对我没用,但它帮助我意识到问题是在我添加远程SSH连接之后开始的。 - undefined

我刚刚把这个添加到了我的 .bashrc 文件中:
alias code='/mnt/c/Users/[YOUR USER DIR NAME]/AppData/Local/Programs/Microsoft\ VS\ Code/bin/code'

我的工作方式与@cloudcreatordotio有些不同,我在我的.bashrc文件中添加了这行代码,并展示以下步骤:
  1. 打开你的 Ubuntu shell

  2. 打开 .bashrc 文件

    nano .bashrc
  3. 添加以下行

    alias code="'/mnt/c/Users/[你的用户目录名]/AppData/Local/Programs/Microsoft VS Code/Code.exe'"

最后我终于搞定了。我相信是以下的方法解决了问题。
  1. 打开终端并删除你的 settings.json 文件。在此之前,你可能希望先备份一下。 从终端打开的文件

  2. 按下 ctrl-a,删除所有内容,然后保存文件。

  3. 非常重要的一步。当你回到终端时,点击右下角的保存按钮。 点击保存按钮!

  4. 现在,这一步可能不太好玩,但我们需要从 PowerShell 中注销 Ubuntu-20.04

    注意:这是一个破坏性操作,WSL 实例文件系统中的所有数据都将丢失。在进行此步骤之前,你可以使用 wsl --export Ubuntu-20.04 <备份文件名.tar> 进行备份以确保安全。当你准备好后,在 PowerShell 中输入 wsl --unregister Ubuntu-20.04 或者你的发行版名称。

  5. 重新启动你的计算机!!!

  6. 当你的计算机重新启动后,你需要重新安装你的发行版并将其设置为默认。使用命令 wsl --install -d <发行版名称>

  7. 按照设置步骤进行操作,然后我只需输入 code .,下面的交互界面就会出现。现在它对我来说正常工作了。

drewbie@drewbie:~$ cd ~
drewbie@drewbie:~$ ls
drewbie@drewbie:~$ ls -la
total 24
drwxr-xr-x 3 drewbie drewbie 4096 Jan 12 18:12 .
drwxr-xr-x 3 root    root    4096 Jan 12 18:12 ..
-rw-r--r-- 1 drewbie drewbie  220 Jan 12 18:12 .bash_logout
-rw-r--r-- 1 drewbie drewbie 3771 Jan 12 18:12 .bashrc
drwxr-xr-x 2 drewbie drewbie 4096 Jan 12 18:12 .landscape
-rw-r--r-- 1 drewbie drewbie    0 Jan 12 18:12 .motd_shown
-rw-r--r-- 1 drewbie drewbie  807 Jan 12 18:12 .profile
drewbie@drewbie:~$ code .
Installing VS Code Server for x64 (899d46d82c4c95423fb7e10e68eba52050e30ba3)
Downloading: 100%
Unpacking: 100%
Unpacked 1722 files and folders to /home/drewbie/.vscode-server/bin/899d46d82c4c95423fb7e10e68eba52050e30ba3.

1太好了 - 很高兴听到你解决了问题!虽然移除WSL/Ubuntu和Windows终端设置有点过激,但很高兴你已经度过了这个问题。为了“安全”起见,我会对你的答案进行一些微小的编辑,不过没什么大不了的。 - NotTheDr01ds
@NotTheDr01ds 谢谢你的修订!事实上,他们将失去他们的一切 :( - drewkiimon
解决了我的问题!谢谢 @drewkiimon - macgyver_sc

这个问题的所有合理解决方案在我的新笔记本上都没有起作用。根本原因是我进行设置的顺序不对。
我的错误: 在启动代码之前,我已经设置了/etc/wsl/conf文件,将Windows路径追加到wsl路径中,设为false。这些/mnt/c/Windows/路径在进行各种开发任务时可能会引起问题,但显然最初需要它们才能使代码正常工作。
[interop]
appendWindowsPath = false

所以,当我在wsl中运行code .时,它不知道在哪里找到它,结果就是这样。
修复方法:
允许将Windows路径添加到末尾 sudo nano /etc/wsl.conf
[interop]
appendWindowsPath = true

退出wsl然后关闭它 wsl --shutdown
重新进入wsl并启动code code .
应该会安装。
可选:
您可以再次从配置文件中删除Windows路径,并将路径添加到~/.bashrc文件中:
export PATH="/mnt/c/Program Files/Microsoft VS Code/bin:$PATH"