ฉันจะใช้ Bash บน Ubuntu บน Windows (WSL) สำหรับ VS Code Terminal ได้อย่างไร


88

ในขณะที่คำถามอื่น ๆ เกี่ยวกับวิธีใช้สิ่งต่างๆเช่น git-bash การให้ WSL ใหม่หมุนเนื่องจากเทอร์มินัลสำหรับ VS Code ไม่เหมือนกัน: ช่วยให้คุณเข้าถึง bash ที่ทำงานบนระบบย่อย Ubuntu Linux จริงแทน git- bash terminal ทำงานบนระบบย่อยของ Windows

ดังนั้นเราจะทำให้มันทำงานเป็นเทอร์มินัล VS Code ได้อย่างไรและโดยเฉพาะอย่างยิ่งเราจะทำให้มันทำงานเป็นเทอร์มินัลสภาพแวดล้อม dev ที่ใช้งานได้อย่างไร

ซึ่งแตกต่างจาก git-bash แต่น่าเสียดายที่ไม่ง่ายอย่างที่คิดเนื่องจากการกำหนดค่า Ubuntu Linux ใน WSL สามารถให้ gotchas บางอย่างเช่น NPM พยายาม (และล้มเหลว) เพื่อเรียกใช้จากไดเร็กทอรี Windows Program Files ของคุณเนื่องจากการโต้ตอบระหว่าง WSL และ Windows ใน เงื่อนไขของการกำหนดเส้นทางและบางแพ็กเกจเช่น Compass ล้มเหลวเนื่องจากสาเหตุที่ไม่จำเป็นต้องชัดเจนในทันทีสำหรับผู้ที่ไม่คุ้นเคยกับการพัฒนาบน Linux อะไรคือวิธีง่ายๆในการมีสภาพแวดล้อมเทอร์มินัล WSL ที่เชื่อถือได้สำหรับ VS Code ซึ่งเครื่องมือที่ใช้บ่อยที่สุดจะทำงานเมื่อติดตั้งผ่านapt-getหรือnpmไม่?

คำตอบ:


185

คำตอบนี้พยายามช่วยให้ผู้อื่นหลีกเลี่ยงการใช้เวลา 1-2 ชั่วโมงในการแก้ไขปัญหาและค่อยๆหาวิธีแก้ปัญหาที่แตกต่างกันสำหรับปัญหาทั่วไปเมื่อใช้ WSL สำหรับเทอร์มินัลใน VS Code ไม่ครอบคลุมถึงการติดตั้งแพ็กเกจเฉพาะ แต่เป็นแพ็กเกจทั่วไปที่อาจติดตั้งไม่ถูกต้องตามการอ้างอิงเมื่อติดตั้งสิ่งต่างๆที่ต้องพึ่งพาการมีอยู่และการแก้ไขการตั้งค่าทั่วไปที่เกี่ยวข้อง

สรุปขั้นตอน

  • ติดตั้ง WSL แล้ว
  • VS Code (หรือ IDE อื่น ๆ ) ที่กำหนดค่าสำหรับเทอร์มินัล
  • ติดตั้ง NPM & แก้ไขเส้นทางใน. profile (อาจช่วยในเรื่องเครื่องมืออื่น ๆ )
  • ติดตั้ง build-essential (ช่วยในเรื่องเครื่องมือที่ใช้ make / gcc / etc)
  • VS Code Tasks โดยใช้ WSL
  • พิเศษ

การเริ่มต้นและข้อกำหนด

  • คุณต้องมีการติดตั้ง WSL (ซึ่งหมายความว่าคุณต้องใช้งานWindows 10 แบบ 64 บิตพร้อมการอัปเดตที่เหมาะสม) ทำตามคำแนะนำการติดตั้งหากยังไม่ได้ติดตั้ง สิ่งนี้จะต้องมีการรีบูต

VS Code Terminal Configuration

ทั้งCTRL+ ,แป้นพิมพ์ลัดหรือFile→การPreferences→การSettings

ในด้านบนขวาของหน้าต่างการแก้ไขให้แน่ใจว่าคุณกำลังทำงานอยู่ในบริบทที่ถูกต้องสำหรับคุณ: ทั้งตั้งค่าผู้ใช้หรือการตั้งค่าพื้นที่ทำงาน

ใส่คำอธิบายภาพที่นี่

ในแถบค้นหาการตั้งค่าพิมพ์ terminal.integrated.shell.windows (หรืออะไรก็ได้ที่ทำให้คุณยาวพอ)

ค้นหาการตั้งค่าในไฟล์การตั้งค่าจริงใช้Edit(วางเมาส์เหนือเส้นจะอยู่ทางซ้าย: บนหน้าจอสัมผัสโดยไม่ต้องใช้เมาส์คุณควรจะสามารถแตะทางด้านซ้ายของเส้นได้) แล้วเลือกReplace in Settings

ใส่คำอธิบายภาพที่นี่

ในบานหน้าต่างด้านขวาแก้ไขรายการที่สร้างในไฟล์ json ที่แก้ไข: แทนที่การตั้งค่าก่อนหน้าด้วย

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

ใส่คำอธิบายภาพที่นี่

IDE อื่น ๆ : IntelliJ

เปิดการตั้งค่า / เครื่องมือ / เทอร์มินัลและตั้งค่าฟิลด์ "เส้นทางเชลล์" เป็น "C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps\ubuntu.exe"

ทำให้ WSL Ubuntu Bash Terminal ของคุณใช้งานได้สำหรับ dev

เมื่อคุณใช้CTRL+ `เพื่อเปิดเทอร์มินัลตอนนี้คุณควรมี bash terminal

หากนี่เป็นครั้งแรกที่คุณเรียกใช้ bash.exe คุณอาจถูกถามเกี่ยวกับการติดตั้ง Ubuntu ทำเช่นนั้น เมื่อการติดตั้งของคุณเสร็จสมบูรณ์ให้เลือกชื่อผู้ใช้และรหัสผ่านของคุณที่จะใช้ใน WSL Ubuntu สิ่งเหล่านี้ไม่จำเป็นต้องตรงกับบัญชี Windows ปัจจุบันของคุณและสิ่งสำคัญคือต้องทราบว่าจะไม่เปลี่ยนแปลงตามการเปลี่ยนแปลงรหัสผ่านของบัญชี Windows ของคุณ

เมื่อเสร็จแล้วคุณจะมีพรอมต์คำสั่ง bash ในเทอร์มินัลของคุณใส่คำอธิบายภาพที่นี่

โปรดทราบว่าไม่เหมือนกับ git-bash บน Windows นี่คือสภาพแวดล้อมที่แยกจากกัน ในขณะที่สามารถใช้เพื่อเปิดตัวซอฟต์แวร์ Windows ภายนอกตัวเองได้ แต่คุณจะต้องใช้แพ็คเกจ Ubuntu ที่เหมาะสมเพื่อเรียกใช้ภายในเทอร์มินัลจริง

ปัจจุบัน WSL ไม่ได้มาพร้อมกับทุกสิ่งที่คุณอาจคาดหวังหรือคุ้นเคยและบางสิ่งอาจขัดแย้งกับซอฟต์แวร์ที่คุณโหลดใน Windows ตามการตั้งค่าโปรไฟล์เริ่มต้น

อัปเดตและคอมไพล์

หมายเหตุ:ฉันจะบันทึกสิ่งเหล่านี้เป็น sudo สำหรับผู้ที่ต้องการเพียงชิ้นเดียว แต่ตัวเลือกหนึ่งในตอนเริ่มต้นคือการsudo suเรียกใช้คำสั่งต่อไปนี้แทนโดยไม่ใช้ sudo

ตรวจสอบให้แน่ใจว่าแพ็คเกจ Ubuntu ของคุณเป็นรุ่นล่าสุด:

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

ติดตั้งคอมไพล์:

sudo apt-get install git

Node.js และ NPM

หากคุณมี Node หรือ NPM ที่โหลดใน Windows อยู่แล้วการรันใน Ubuntu อาจมีปัญหาเนื่องจากปัญหาเส้นทาง ดังนั้นคุณต้องติดตั้ง Ubuntu เวอร์ชันเนทีฟและตรวจสอบให้แน่ใจว่าใช้แทนได้

ครั้งแรกที่ติดตั้งกับ Node.js NPM (ทางเลือก: ติดตั้ง NVMและใช้เพื่อติดตั้ง node.js)

หลังจากติดตั้งการรันคำสั่ง npm อาจล้มเหลวตัวอย่างเช่นnpm -vอาจให้คุณ:

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

นี่คือเนื่องจากมีปัญหา pathing ด้วยโซลูชั่นที่ค่อนข้างตรงไปตรง โดยใช้โปรแกรมแก้ไข CLI ที่คุณชื่นชอบ (เช่นnano, vim, emacs, catและsed... ฯลฯ ) เปิดของคุณ~/.profile

nano ~/.profile

หมายเหตุ: อย่าพยายามที่จะแก้ไขไฟล์ลินุกซ์โดยใช้เครื่องมือของ Windows (ขอบคุณความคิดเห็นของ @ david-c-rankinสำหรับลิงก์อย่างเป็นทางการพร้อมข้อความสีแดงตัวหนาที่อธิบายสิ่งนี้) หากคุณไม่ต้องการใช้โปรแกรมแก้ไข CLI สำหรับสิ่งนี้ในเทอร์มินัลโปรดดูลิงก์ด้านล่างของโพสต์นี้ เพื่อให้ GUI ทำงานได้

ปัจจุบันตัวแปร bash PATH เริ่มต้นใน WSL คือ

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

ซึ่งกำลังฉีดพา ธ windows หลังจากสองไดเร็กทอรีไบนารีแรก น่าเสียดายที่สิ่งนี้ไม่ส่งผลให้ / usr / bin ถูกใช้ก่อนที่ windows จะติดตั้ง npm ดังนั้นให้เพิ่มก่อน $ PATH สุดท้าย:

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

บันทึกจากนั้นโหลดเทอร์มินัลใหม่หรือเพียงแค่ซอร์สไฟล์พา ธ

source ~/.profile

โครงสร้างที่จำเป็น

หากคุณใช้สิ่งใดก็ตามที่ต้องใช้การคอมไพล์หรือใช้ make ก็แทบจะรับประกันได้ว่าคุณจะต้องติดตั้งสิ่งเหล่านี้ ดังนั้นหากคุณไม่ได้ติดตั้งขณะติดตั้ง node.js ให้ทำเช่นนั้น ง่ายกว่ามากที่จะใช้แพ็คเกจที่จำเป็นในการสร้างแทนที่จะพยายามติดตั้งทุกอย่างแยกกัน

โปรดทราบว่าแพ็กเกจเช่น Compass ซึ่งใช้ Ruby FFI จะล้มเหลวหากไม่มีสิ่งเหล่านี้ หากคุณประสบปัญหาในการติดตั้งและเรียกใช้เครื่องมืออย่างถูกต้องตรวจสอบให้แน่ใจว่าคุณมี gcc และทำการติดตั้งแล้วอาจเป็นจุดเริ่มต้นที่ดี

sudo apt-get install -y build-essential

เรียกใช้งานโดยใช้ Ubuntu

โปรดทราบว่าหากคุณใช้งาน VS Code ของ VS Code เพื่อเรียกใช้งานบิลด์โดยค่าเริ่มต้นระบบจะยังคงรันโดยใช้ระบบย่อยของ Windows แทนระบบ Ubuntu บางครั้งนี่อาจเป็นสิ่งที่คุณต้องการ แต่ถ้าคุณเพิ่งติดตั้ง grunt-cli ใน Ubuntu เสร็จแล้วไม่ใช่ Windows ก็อาจจะไม่ใช่

VS Code เพิ่งมีการอัปเดต 2017 พฤษภาคมเกี่ยวกับวิธีการทำงานของ Tasks ที่อนุญาตให้ตั้ง Task Runner เป็น Terminal ได้ตั้งค่าวิ่งงานเป็นขั้วนี่เป็นวิธีที่ง่ายที่สุดในการโยกย้ายงาน

เพียงแค่ตั้งค่า

"runner": "terminal",

ในของคุณtasks.jsonและคุณทำเสร็จแล้ว (สมมติว่าคุณมีเครื่องมือที่เหมาะสมทั้งหมดที่คุณพยายามเรียกใช้ในขณะนี้ติดตั้งใน WSL Ubuntu)ใส่คำอธิบายภาพที่นี่

นี่เป็นแบบพกพามากโดยไม่ต้องมีการเปลี่ยนแปลงระหว่างระบบที่ทำหรือไม่มี WSL หรือกับ OS อื่น ๆ และเป็นวิธีที่ฉันอยากจะแนะนำ

ในขณะนี้วิธีนี้จะสร้างTERMINALอินสแตนซ์แท็บอื่น(เข้าถึงได้จากเมนูแบบเลื่อนลง) คุณยังคงสามารถตั้งค่าผู้เฝ้าดูที่เหมาะสมได้ แต่หมายความว่าจะไม่นั่งอยู่บนOUTPUTแท็บอีกต่อไป

วิธีการแบบเก่าสามารถเรียกใช้เชลล์ WSL Ubunutu Bash และแสดงขึ้นมาOUTPUTและเกี่ยวข้องกับการเรียก bash.exe ด้วยอาร์กิวเมนต์ -c หรือใช้เชลล์สคริปต์ น่าเสียดายที่ไม่ได้เป็นความหมายเนื่องจากเรากำลังสร้างbashคำสั่งและส่งผ่านสิ่งที่เราต้องการเรียกใช้เป็นอาร์กิวเมนต์แทน นอกจากนี้ยังหมายความว่ามันไม่สามารถพกพาไปยังระบบอื่น ๆ ได้อย่างรวดเร็ว

คุณสามารถใช้ตำแหน่งเดียวกับที่คุณให้ VS Code ก่อนหน้านี้สำหรับเทอร์มินัลเองC:\\WINDOWS\\Sysnative\\bash.exeเป็นค่าสำหรับcommandใส่คำอธิบายภาพที่นี่

ตั้งค่าองค์ประกอบแรกของargsอาร์เรย์เป็น-cและส่วนที่สองเป็นคำสั่งที่คุณต้องการเรียกใช้ ( ให้เครดิตกับครึ่งหลังของคำตอบนี้ )

หรือคุณแทนสามารถเรียกใช้สคริปต์เชลล์เท่าที่เห็นนี่

บิตที่เป็นประโยชน์เพิ่มเติม

ต้องการเริ่ม VSCode ใน Windows จากบรรทัดคำสั่ง WSL Bashหรือไม่?

ต้องการมีอินเทอร์เฟซแบบกราฟิกสำหรับ WSL Ubuntu ของคุณหรือไม่? (สิ่งนี้จะช่วยให้คุณทำสิ่งต่างๆเช่นใช้ตัวแก้ไข Linux GUI สำหรับไฟล์ภายในระบบ Ubuntu เอง: อย่าแก้ไขโดยใช้เครื่องมือแก้ไขของ Windows ดูความคิดเห็น / หมายเหตุในส่วนบน npm)

ต้องการสร้าง (ดูส่วนด้านบนเกี่ยวกับการตั้งค่า VS Code Tasks อย่างถูกต้องสำหรับ WSL) และดีบักทั้งหมดภายใน WSL Ubuntuหรือไม่ (แสดงวิธีการโดยใช้ gdb แต่pipeTransportแนวคิดนี้สามารถใช้กับ debuggers อื่น ๆ ได้) (ให้เครดิตกับคำตอบนี้แต่ก่อนหน้านี้ยังมีวิธีการโดยใช้ local loopback ที่พิสูจน์ได้ว่ามีประโยชน์)


10
คำตอบที่ดีนอกจากนี้ยังมีประโยชน์ในการแจ้งให้ทราบอย่าเปลี่ยนไฟล์ Linux โดยใช้แอพและเครื่องมือ Windows สำหรับผู้ใช้ WSL ใหม่ สิ่งนี้อาจเป็นเรื่องที่น่าประหลาดใจทีเดียว
David C. Rankin

1
ขอบคุณมาก! ไม่แน่ใจว่าคุณได้เห็นนี้ แต่ยังมีรายการรีจิสทรีที่คุณสามารถทำเพื่อป้องกันไม่ให้เส้นทางของ Windows จากการถูกฉีดเข้าไปทุบตีซึ่งอาจจะง่ายสำหรับผู้ใช้ Windows .profileมากมายกว่าการแก้ไขด้วยตนเองของพวกเขา
Tobias J

3
@ChangQian เหตุผลก็คือเมื่อเปิดตัว Windows 64 บิตพวกเขาได้เพิ่มตัวเปลี่ยนเส้นทางระบบไฟล์สำหรับโปรแกรม 32 บิตเนื่องจาก System32 สงวนไว้สำหรับ 64 บิต dlls / ซอฟต์แวร์ สิ่งนี้ส่งผลให้แอพ 32 บิตพยายามเข้าถึง System32 แทนการเข้าถึง SysWOW64 (ใช่ดูเหมือนว่าถอยหลัง) Sysnative บังคับให้สิ่งนี้ไม่เกิดขึ้น แต่จะไม่ปรากฏในซอฟต์แวร์ 64 บิต * เช่น Explorer คุณสามารถดูตัวอย่างของสิ่งนี้ได้โดยใช้พรอมต์คำสั่ง 32 บิต: C:\Windows\SysWOW64\cmd.exeและเรียกใช้dir C:\Windows\Sysnative * สิ่งนี้ทำงานใน VSCode 64 บิตเนื่องจากมีการเข้ารหัสเพื่อแปลโดยอัตโนมัติ
taswyn

2
เมื่อคุณตั้งค่าเทอร์มินัลเป็นubuntu.exeคุณอาจไปอยู่ในโฟลเดอร์ผู้ใช้ของคุณแทนที่จะเป็นโฟลเดอร์ของโครงการ นั่นเป็นเหตุผลที่คุณต้องการตั้งค่าเทอร์มินัลของคุณC:\\Windows\\System32\\wsl.exeตามgithub.com/Microsoft/WSL/issues/2795ใช้wslconfig /setdefault Ubuntuเพื่อให้แน่ใจว่าการติดตั้งที่ถูกต้องเริ่มต้นขึ้น
Bernhard Döbler

1
เมื่อฉันเขียนสิ่งนี้มันเป็นตอนที่ WSL ถูกล็อคมากขึ้น (ก่อนตัวเลือก distro / ฯลฯ ) ฉันมีเครื่องที่มีการติดตั้ง windows ใหม่ที่ได้รับการอัปเดตเป็นรุ่น Spring Creator เป็นอย่างน้อยดังนั้นในที่สุดฉันจะตรวจสอบสิ่งที่สามารถปรับปรุงได้ตามความคิดเห็นต่างๆและพยายามตอบคำถามของคุณ @Narnia
taswyn

4

หากคุณต้องการใช้ zsh ให้ค้นหาเส้นทางของ ubuntu1804.exe หรือ ubuntu1604.exe

ในกรณีของฉัน

"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",

ทำงานได้ดีกับรหัส Visual Studio เวอร์ชัน 1.32 และ WSL กับ ubuntu ขอบคุณ!
Salvador P.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.