Jak korzystać z Bash w systemie Ubuntu w systemie Windows (WSL) dla mojego terminala VS Code?

87

Podczas gdy inne pytania dotyczą tego, jak używać rzeczy takich jak git-bash , nadanie nowemu WSL spin jako terminala dla kodu VS to nie to samo: daje dostęp do bash działającego na rzeczywistym podsystemie Ubuntu Linux, zamiast git- terminal bash działający w podsystemie Windows.

Jak więc sprawić, by działał jako terminal VS Code, a zwłaszcza jak sprawić, by działał jako funkcjonalny terminal środowiska deweloperskiego?

W przeciwieństwie do git-bash, nie jest to niestety tak proste, ponieważ konfiguracja Ubuntu Linux w WSL może dostarczyć pewnych pułapek, takich jak próba (i niepowodzenie) NPM do uruchomienia z katalogu Windows Program Files z powodu interakcji między WSL a samym Windowsem w warunki ścieżki, a niektóre pakiety, takie jak Compass, zawodzą z powodów niekoniecznie oczywistych dla kogoś, kto nie jest przyzwyczajony do programowania w systemie Linux. Jaki jest prosty sposób na uzyskanie niezawodnego środowiska terminala WSL dla VS Code, w którym najczęściej używane narzędzia będą działać po zainstalowaniu za pośrednictwem apt-getlub npm?

taswyn
źródło

Odpowiedzi:

184

Ta odpowiedź ma na celu pomóc innym uniknąć spędzania 1-2 godzin na rozwiązywaniu problemów i powolnym znajdowaniu różnych rozwiązań typowych problemów podczas korzystania z WSL dla terminala w VS Code. Nie obejmuje instalowania określonych pakietów, ale raczej typowych, które mogą nie instalować się poprawnie jako zależności podczas instalowania rzeczy, które zależą od ich obecności, i naprawiania powiązanych wspólnych ustawień.

Podsumowanie czynności

  • Zainstalowano WSL
  • VS Code (lub inne IDE) skonfigurowane dla terminala
  • NPM zainstalowany i poprawka ścieżki w .profile (może pomóc z innymi narzędziami)
  • zainstalowany build-essential (pomaga we wszystkich narzędziach używających make / gcc / etc)
  • Zadania VS Code przy użyciu WSL
  • Dodatki

Pierwsze kroki i wymagania

  • Musisz mieć zainstalowany WSL . (Co oznacza, że ​​musisz korzystać z 64-bitowego systemu Windows 10 z odpowiednimi aktualizacjami). Postępuj zgodnie z instrukcją instalacji, jeśli nie została jeszcze zainstalowana. Będzie to wymagało kilku ponownych uruchomień.

Konfiguracja terminala VS Code

Albo skrót klawiaturowy CTRL+ ,, albo FilePreferencesSettings

W prawym górnym rogu okna edycji, upewnij się, że pracuje w prawidłowym kontekście dla Ciebie: albo Ustawienia użytkownika lub Ustawienia Workspace .

wprowadź opis obrazu tutaj

W pasku wyszukiwania ustawień wpisz terminal.integrated.shell.windows(lub cokolwiek zajmie wystarczająco dużo czasu)

Znajdź ustawienie w aktualnym pliku ustawień, użyj Edit(najedź myszką na linię, będzie po lewej stronie: na ekranie dotykowym bez myszy powinieneś być w stanie po prostu dotknąć po lewej stronie linii) i wybraćReplace in Settings

wprowadź opis obrazu tutaj

W prawym okienku zmodyfikuj wpis utworzony w zmodyfikowanym pliku json: zamień poprzednie ustawienie na

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

wprowadź opis obrazu tutaj

Inne IDE: IntelliJ

Otwórz Ustawienia / Narzędzia / Terminal i ustaw pole „Ścieżka powłoki” na "C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps\ubuntu.exe"

Uczynienie terminala WSL Ubuntu Bash funkcjonalnym dla programistów

Kiedy używasz CTRL+ `do otwierania terminala, powinieneś mieć teraz terminal bash.

Jeśli uruchamiasz bash.exe po raz pierwszy, możesz zostać zapytany o instalację Ubuntu. Zrób tak. Po zakończeniu instalacji wybierz nazwę użytkownika i hasło, które będą używane w WSL Ubuntu. Nie muszą one pokrywać się z bieżącym kontem systemu Windows i należy pamiętać, że nie zmienią się one po zmianie hasła do konta Windows.

Gdy skończysz, w terminalu pojawi się wiersz polecenia bash.wprowadź opis obrazu tutaj

Zwróć uwagę, że w przeciwieństwie do git-bash w systemie Windows jest to osobne środowisko. Chociaż może być używany do uruchamiania oprogramowania Windows poza nim, będziesz potrzebować odpowiednich pakietów Ubuntu, aby uruchomić je w rzeczywistym terminalu.

Obecnie WSL nie zawiera wszystkiego, czego możesz się spodziewać lub do czego przywykłeś, a niektóre rzeczy mogą kolidować z oprogramowaniem załadowanym w systemie Windows, w oparciu o domyślne ustawienia profilu.

Aktualizacje i git

Uwaga: mam zamiar udokumentować to jako sudo dla osób, które po prostu potrzebują pojedynczych fragmentów tego, ale jedną z opcji na początku jest sudo supo prostu uruchomienie następujących poleceń bez sudo.

Upewnij się, że Twoje pakiety Ubuntu są aktualne:

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

Zainstaluj git:

sudo apt-get install git

Node.js i NPM

Jeśli masz już Node lub NPM załadowane w systemie Windows, uruchomienie ich w Ubuntu może być problematyczne z powodu problemów ze ścieżką. Musisz więc zainstalować natywne wersje Ubuntu i upewnić się, że są używane.

Najpierw zainstaluj node.js z NPM . (alternatywnie: zainstaluj NVM i użyj go do zainstalowania node.js)

Po zainstalowaniu, uruchomienie poleceń npm prawdopodobnie zakończy się niepowodzeniem: na przykład npm -vprawdopodobnie da ci:

: 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")

Wynika to z problemu ze ścieżką z dość prostym rozwiązaniem . Za pomocą dowolnego edytora CLI (takich jak nano, vim, emacs, cati sed... itd), otwórz~/.profile

nano ~/.profile

Uwaga: NIE próbuj edytować plików Linuksa za pomocą narzędzi Windows . (Dzięki komentarzowi @ david-c-rankin za oficjalny link z wytłuszczonym czerwonym tekstem wyjaśniającym to) Jeśli nie chcesz używać do tego edytora CLI w terminalu, zobacz na dole tego posta link do aby uruchomić GUI.

Obecnie domyślną zmienną bash PATH w WSL jest

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

Który wstrzykuje ścieżkę systemu Windows po pierwszych dwóch katalogach binarnych. Niestety, nie powoduje to użycia / usr / bin przed zainstalowaniem npm systemu Windows, więc dodaj to przed końcową $ PATH:

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

Zapisz, a następnie załaduj ponownie terminal lub po prostu pobierz plik ścieżki

source ~/.profile

Niezbędne do budowania

Jeśli używasz czegokolwiek, co wymaga kompilacji lub w inny sposób używa make, jest prawie pewne, że będziesz potrzebować tych zainstalowanych; więc jeśli nie zainstalowałeś ich podczas instalacji node.js, zrób to. O wiele łatwiej jest po prostu użyć pakietu niezbędnego do kompilacji, zamiast próbować instalować wszystko osobno.

Zwróć uwagę, że pakiety takie jak Compass, które opierają się na Ruby FFI, bez nich zawiodą. Jeśli masz problemy z poprawną instalacją i uruchomieniem narzędzia, dobrym miejscem do rozpoczęcia może być upewnienie się, że masz gcc i zainstalowanie programu.

sudo apt-get install -y build-essential

Uruchamianie zadań przy użyciu Ubuntu

Zwróć uwagę, że jeśli używasz tasks.json VS Code do uruchamiania zadań kompilacji, domyślnie nadal będzie je uruchamiał przy użyciu podsystemu Windows zamiast Ubuntu. Czasami może to być to, czego chcesz, ale jeśli właśnie zakończyłeś instalację grunt-cli w systemie Ubuntu, a nie w systemie Windows, prawdopodobnie tak nie jest.

VS Code niedawno zaktualizował sposób działania zadań z maja 2017 r., Który pozwala ustawić moduł uruchamiający zadania jako terminal . Jest to zdecydowanie najłatwiejszy sposób migracji zadań.

Po prostu ustaw

"runner": "terminal",

w swoim tasks.jsoni gotowe (zakładając, że masz wszystkie odpowiednie narzędzia, które próbujesz teraz uruchomić, zainstalowane w WSL Ubuntu).wprowadź opis obrazu tutaj

Jest to bardzo przenośne rozwiązanie, idealnie nie wymagające zmian między systemami, które mają lub nie mają WSL, lub innymi systemami operacyjnymi i jest metodą, którą polecam.

W tej chwili ta metoda TERMINALpowoduje utworzenie innej instancji karty (dostępnej z menu rozwijanego). Nadal możesz skonfigurować odpowiednich obserwatorów, ale oznacza to, że nie znajduje się już na OUTPUTkarcie.

Stara metoda jest w stanie wywołać powłokę WSL Ubunutu Bash i spowodować jej pojawienie się OUTPUT, i obejmuje wywołanie bash.exe z argumentem -c lub użycie skryptu powłoki. Niestety nie jest tak semantyczny, ponieważ wydajemy bashpolecenie i przekazujemy mu to, co chcemy zamiast tego uruchomić jako argument. Oznacza to również, że nie można go tak szybko przenieść na inne systemy.

Możesz użyć tej samej lokalizacji, którą podałeś wcześniej VS Code dla samego terminala, C:\\WINDOWS\\Sysnative\\bash.exejako wartości dlacommandwprowadź opis obrazu tutaj

Ustaw pierwszy element argstablicy jako, -ca drugi jako polecenie, które chcesz uruchomić ( uznanie dla drugiej połowy tej odpowiedzi ).

Alternatywnie możesz zamiast tego uruchomić skrypt powłoki, jak pokazano tutaj .

Dalsze pomocne wskazówki

Chcesz uruchomić VSCode w systemie Windows z wiersza poleceń WSL Bash ?

Chcesz mieć interfejs graficzny dla swojego WSL Ubuntu ? (pozwoli ci to na takie rzeczy, jak użycie edytora GUI Linuksa dla plików w samym systemie Ubuntu: nie edytuj ich za pomocą narzędzi edycyjnych Windows, zobacz komentarze / uwaga w sekcji npm)

Chcesz zbudować (zobacz powyższą część dotyczącą prawidłowego konfigurowania zadań VS Code dla WSL) i debugować całkowicie w WSL Ubuntu ? (to pokazuje, jak to zrobić za pomocą gdb, ale pipeTransportkoncepcja może być używana z innymi debuggerami) (uznanie dla tej odpowiedzi , ale ta przed nią zapewnia również metodę wykorzystującą lokalną pętlę zwrotną, która może okazać się przydatna)

taswyn
źródło
10
Dobra odpowiedź, przydatne jest również umieszczenie powiadomienia Nie zmieniaj plików Linuksa za pomocą aplikacji i narzędzi Windows dla nowych użytkowników WSL. To może być sporym zaskoczeniem.
David C. Rankin
1
Świetne napisanie, dzięki! Nie jestem pewien, czy to widziałeś, ale istnieje również wpis rejestru, który możesz wprowadzić, aby zapobiec wstrzyknięciu ŚCIEŻKI systemu Windows do Bash, co może być łatwiejsze dla wielu użytkowników systemu Windows niż ręczne edytowanie ich .profile.
Tobias J
3
@ChangQian powodem tego jest to, że gdy wydano 64-bitowe okna, dodali readresator systemu plików dla programów 32-bitowych, ponieważ System32 był zarezerwowany dla 64-bitowych bibliotek dll / oprogramowania. Powoduje to 32-bitowe aplikacje, które próbują uzyskać dostęp do System32 zamiast uzyskiwania dostępu do SysWOW64 (tak, wydaje się, że jest wstecz). Sysnative wymusza, aby tak się nie stało, ale nie pojawia się w oprogramowaniu 64-bitowym *, takim jak Explorer. Możesz zobaczyć przykład tego za pomocą 32-bitowego wiersza poleceń: C:\Windows\SysWOW64\cmd.exei działa dir C:\Windows\Sysnative * Działa w 64-bitowym VSCode, ponieważ jest zakodowany, aby tłumaczyć go automatycznie
taswyn
2
Kiedy ustawisz terminal na, ubuntu.exemożesz skończyć w swoim folderze użytkownika zamiast w folderze projektu. Dlatego chcesz ustawić terminal C:\\Windows\\System32\\wsl.exezgodnie z github.com/Microsoft/WSL/issues/2795 Użyj, wslconfig /setdefault Ubuntuaby upewnić się, że rozpocznie się właściwa instalacja.
Bernhard Döbler
1
Kiedy to napisałem, było to wtedy, gdy WSL było znacznie bardziej zablokowane (przed wyborem dystrybucji / itp.). Mam maszynę ze świeżą instalacją okien, która została zaktualizowana co najmniej do wersji Spring Creator, więc w końcu przyjrzę się wkrótce, jakie ulepszenia można wprowadzić za pomocą różnych komentarzy i spróbuję odpowiedzieć na Twoje pytanie, @Narnia.
taswyn
4

jeśli chcesz użyć zsh, znajdź ścieżkę do ubuntu1804.exe lub ubuntu1604.exe.

w moim przypadku

"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
źródło
Działa dobrze z wersją 1.32 Visual Studio Code i WSL z Ubuntu. Dzięki!
Salvador P.