Como eu uso o Bash no Ubuntu no Windows (WSL) para meu terminal VS Code?

87

Enquanto outras questões tratam de como usar coisas como git-bash , dar ao novo WSL um giro como o terminal para VS Code não é o mesmo: ele dá acesso ao bash rodando em um subsistema Ubuntu Linux real, em vez do git- terminal bash em execução no subsistema Windows.

Então, como podemos fazer com que ele funcione como o terminal do VS Code e, particularmente, como o fazemos funcionar como um terminal de ambiente de desenvolvimento funcional?

Ao contrário do git-bash, isso infelizmente não é tão simples, porque a configuração do Ubuntu Linux em WSL pode fornecer alguns truques, como NPM tentando (e falhando) para executar a partir do diretório de arquivos de programas do Windows devido à interação entre WSL e o próprio Windows termos de pathing, e alguns pacotes como o Compass falhando por motivos que não são necessariamente óbvios para alguém que não está acostumado a desenvolver no Linux. Qual é uma maneira simples de ter um ambiente de terminal WSL confiável para o VS Code, onde as ferramentas usadas com mais frequência serão executadas quando instaladas por apt-getou npm?

Taswyn
fonte

Respostas:

184

Esta resposta visa ajudar outras pessoas a evitar gastar 1-2 horas solucionando problemas e lentamente encontrando soluções díspares para problemas comuns ao usar WSL para o terminal no VS Code. Não cobre a instalação de pacotes específicos, mas sim os comuns que podem não ser instalados apropriadamente como dependências ao instalar coisas que dependem de sua presença e na correção de configurações comuns relacionadas.

Resumo das etapas

  • WSL instalado
  • Código VS (ou outro IDE) configurado para terminal
  • NPM instalado e correção de caminho em .profile (pode ajudar com outras ferramentas)
  • build-essential instalado (ajuda com quaisquer ferramentas que usem make / gcc / etc)
  • Tarefas de código VS usando WSL
  • Extras

Primeiros passos e requisitos

  • Você deve ter o WSL instalado . (O que significa que você deve estar executando o Windows 10 de 64 bits , com as atualizações apropriadas) Siga o guia de instalação se ainda não estiver instalado. Isso exigirá algumas reinicializações.

Configuração do Terminal de Código VS

O atalho de teclado CTRL+ ,ou FilePreferencesSettings

No canto superior direito da janela de edição, certifique-se de estar trabalhando no contexto correto para você: Configurações do usuário ou Configurações do espaço de trabalho .

insira a descrição da imagem aqui

Na barra de pesquisa de configurações, digite terminal.integrated.shell.windows(ou o que quer que leve você longe o suficiente)

Encontre a configuração no arquivo de configurações real, use Edit(mouse sobre a linha, estará à esquerda: em uma tela de toque sem um mouse, você deve ser capaz de simplesmente tocar à esquerda da linha) e selecionarReplace in Settings

insira a descrição da imagem aqui

No painel direito, modifique a entrada criada no arquivo json modificado: substitua a configuração anterior por

"C:\\WINDOWS\\Sysnative\\bash.exe"

insira a descrição da imagem aqui

Outros IDEs: IntelliJ

Abra Configurações / Ferramentas / Terminal e defina o campo "Caminho do shell" para "C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps\ubuntu.exe"

Tornando seu Terminal WSL Ubuntu Bash funcional para dev

Quando você usa CTRL+` para abrir o terminal, agora você deve ter um terminal bash.

Se esta é a primeira vez que você executa bash.exe, pode ser questionado sobre a instalação do Ubuntu. Faça isso. Assim que a instalação for concluída, escolha seu nome de usuário e senha para serem usados ​​no WSL Ubuntu. Eles não precisam coincidir com a sua conta atual do Windows e é importante observar que não serão alterados com base nas alterações na senha da sua conta do Windows.

Quando terminar, você terá um prompt de comando bash em seu terminal.insira a descrição da imagem aqui

Observe que, ao contrário do git-bash no Windows, este é um ambiente separado. Embora possa ser usado para iniciar software Windows fora dele, você precisará de pacotes Ubuntu apropriados para executá-los dentro do terminal real.

Atualmente, o WSL não vem carregado com tudo o que você espera ou está acostumado a ter, e algumas coisas podem entrar em conflito com o software que você carregou no Windows, com base nas configurações de perfil padrão.

Atualizações e git

Observação: vou documentar isso como sudo para pessoas que simplesmente precisam de partes únicas disso, mas uma opção no início é sudo suexecutar os seguintes comandos sem sudo.

Certifique-se de que seus pacotes do Ubuntu estejam atualizados:

sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade
sudo apt autoremove

Instale o git:

sudo apt-get install git

Node.js e NPM

Se você já tem o Node ou NPM carregado no Windows, executá-los no Ubuntu pode ser problemático devido a problemas de caminho. Portanto, você precisa instalar as versões nativas do Ubuntu e garantir que sejam usadas.

Primeiro, instale node.js com NPM . (alternativo: instale NVM e use-o para instalar node.js)

Após a instalação, a execução dos comandos npm provavelmente falhará: por exemplo, npm -vprovavelmente fornecerá:

: not foundram Files/nodejs/npm: 3: /mnt/c/Program Files/nodejs/npm:
: not foundram Files/nodejs/npm: 5: /mnt/c/Program Files/nodejs/npm:
/mnt/c/Program Files/nodejs/npm: 6: /mnt/c/Program Files/nodejs/npm: Syntax error: word unexpected (expecting "in")

Isso se deve a um problema de caminho com uma solução bastante simples . Usando seu editor CLI favorito (como nano, vim, emacs, cate sed... etc), abra o~/.profile

nano ~/.profile

Nota: NÃO tente editar arquivos Linux usando ferramentas do Windows . (Obrigado ao comentário de @david-c-rankin para o link oficial com o texto em negrito em vermelho explicando isso) Se você não quiser usar um editor CLI para isso no terminal, consulte o final deste post para um link sobre como para obter uma GUI em execução.

Atualmente, a variável bash PATH padrão em WSL é

PATH="$HOME/bin:$HOME/.local/bin:$PATH"

Que está injetando o caminho do Windows após os primeiros dois diretórios binários. Infelizmente, isso não faz com que / usr / bin seja usado antes do npm do Windows instalado, então adicione isso antes do $ PATH final:

PATH="$HOME/bin:$HOME/.local/bin:/usr/bin:$PATH"

Salve e recarregue o terminal ou apenas forneça o arquivo de caminho

source ~/.profile

Construir essencial

Se você estiver usando algo que requeira compilação ou use make, é quase garantido que você precisará deles instalados; portanto, se você não os instalou durante a instalação do node.js, faça-o. É muito mais fácil simplesmente usar o pacote build-essential em vez de tentar instalar tudo separadamente.

Observe que pacotes como o Compass que dependem do Ruby FFI falharão sem eles. Se você estiver tendo problemas para instalar e executar uma ferramenta corretamente, certifique-se de ter gcc e make instalado pode ser um bom lugar para começar.

sudo apt-get install -y build-essential

Executar tarefas usando Ubuntu

Observe que se você usar o tasks.json do VS Code para executar tarefas de compilação, por padrão ele ainda as executará usando o subsistema Windows em vez do Ubuntu. Às vezes, pode ser isso que você deseja, mas se acabou de instalar o grunt-cli no Ubuntu e não no Windows, provavelmente não é.

O VS Code teve recentemente a atualização de maio de 2017 sobre como as Tarefas funcionam, o que permite definir o executor de tarefas como o terminal . Esta é de longe a maneira mais fácil de migrar tarefas.

Basta definir

"runner": "terminal",

em seu tasks.jsone pronto (supondo que você tenha todas as ferramentas apropriadas que está tentando executar agora instaladas no WSL Ubuntu).insira a descrição da imagem aqui

Isso é muito portátil, idealmente não requer mudanças entre sistemas que têm ou não WSL, ou para outros sistemas operacionais, e é o método que eu recomendaria.

A partir do momento, este método gera outra TERMINALinstância de guia (acessada no menu suspenso). Você ainda pode configurar observadores apropriados, mas isso significa que ele não está mais na OUTPUTguia.

O método antigo é capaz de invocar o shell WSL Ubunutu Bash e exibi-lo OUTPUT, e envolve a chamada de bash.exe com o argumento -c ou o uso de um script de shell. Infelizmente não é tão semântico, pois estamos fazendobash nosso comando e passando-o o que queremos executar como um argumento. Isso também significa que não é tão rapidamente portátil para outros sistemas.

Você pode usar o mesmo local que deu ao VS Code anteriormente para o próprio terminal, C:\\WINDOWS\\Sysnative\\bash.execomo o valor paracommandinsira a descrição da imagem aqui

Defina o primeiro elemento da argsmatriz como -ce o segundo como o comando que você deseja executar ( crédito da segunda metade desta resposta ).

Como alternativa, você pode executar um script de shell conforme visto aqui .

Outros bits úteis

Quer iniciar o VSCode no Windows a partir da linha de comando WSL Bash ?

Quer ter uma interface gráfica para o WSL Ubuntu ? (isso permitirá que você faça coisas como usar um editor de GUI do Linux para arquivos dentro do próprio sistema Ubuntu: não os edite usando as ferramentas de edição do Windows, veja comentários / nota na seção sobre npm)

Quer construir (veja a parte acima sobre como configurar o VS Code Tasks corretamente para WSL) e depurar inteiramente dentro do WSL Ubuntu ? (isso mostra como fazer isso usando gdb, mas o pipeTransportconceito poderia ser usado com outros depuradores) (crédito para esta resposta , mas a anterior também fornece um método usando loopback local que pode ser útil)

Taswyn
fonte
10
Boa resposta, também é útil fornecer o aviso Não altere os arquivos do Linux usando aplicativos e ferramentas do Windows para novos usuários WSL. Isso pode ser uma grande surpresa.
David C. Rankin
1
Ótimo artigo, obrigado! Não tenho certeza se você viu isso, mas há também uma entrada de registro que você pode fazer para evitar que o PATH do Windows seja injetado no Bash, o que pode ser mais fácil para muitos usuários do Windows do que editar manualmente o seu .profile.
Tobias J
3
@ChangQian a razão para isso é que quando o Windows de 64 bits foi lançado, eles adicionaram um redirecionador do sistema de arquivos para programas de 32 bits, porque o System32 foi reservado para dlls / software de 64 bits. Isso resulta em aplicativos de 32 bits que tentam acessar System32 em vez de acessar SysWOW64 (sim, parece para trás). Sysnative força isso a não acontecer, mas não aparece em softwares de 64 bits * como o Explorer. Você pode ver um exemplo disso usando o prompt de comando de 32 bits: C:\Windows\SysWOW64\cmd.exee executando dir C:\Windows\Sysnative * Isso funciona em VSCode de 64 bits porque é codificado para traduzi-lo automaticamente
taswyn
2
Quando você configura seu terminal para, ubuntu.exevocê pode acabar na pasta do usuário em vez da pasta do projeto. É por isso que você deseja definir seu terminal de C:\\Windows\\System32\\wsl.exeacordo com github.com/Microsoft/WSL/issues/2795 Use wslconfig /setdefault Ubuntupara garantir que a instalação correta seja iniciada.
Bernhard Döbler
1
Quando escrevi isso, o WSL estava muito mais bloqueado (antes da escolha da distro / etc). Eu tenho uma máquina com uma nova instalação de janelas que foi atualizada pelo menos para a edição do Spring Creator, então finalmente darei uma olhada real em breve nas melhorias que podem ser feitas por vários comentários e tentarei responder sua pergunta, @Narnia.
taswyn
4

se você quiser usar zsh, encontre o caminho de ubuntu1804.exe ou ubuntu1604.exe.

No meu caso

"terminal.external.windowsExec": "C:\\Users\\asdf\\AppData\\Local\\Microsoft\\WindowsApps\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\\ubuntu1804.exe",
"terminal.integrated.shell.windows": "C:\\Users\\asdf\\AppData\\Local\\Microsoft\\WindowsApps\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\\ubuntu1804.exe",
Hyeon ki Hong
fonte
Funcionou bem na versão 1.32 do código do Visual Studio e WSL com ubuntu. Obrigado!
Salvador P.