โปรโฮสต์ > บล็อก > การบริหาร > การรวมคำสั่ง Linux เข้ากับ Windows โดยใช้ PowerShell และ WSL
การรวมคำสั่ง Linux เข้ากับ Windows โดยใช้ PowerShell และ WSL
คำถามทั่วไปจากนักพัฒนา Windows: “เหตุใดจึงยังไม่มี <ВСТАВЬТЕ ТУТ ЛЮБИМУЮ КОМАНДУ LINUX>?. ไม่ว่าจะเป็นการปัดอันทรงพลัง less หรือเครื่องมือที่คุ้นเคย grep หรือ sedนักพัฒนา Windows ต้องการเข้าถึงคำสั่งเหล่านี้อย่างง่ายดายในการทำงานประจำวัน
ระบบย่อย Windows สำหรับ Linux (WSL) ได้ก้าวไปข้างหน้าอย่างมากในเรื่องนี้ อนุญาตให้คุณเรียกคำสั่ง Linux จาก Windows โดยการพร็อกซีคำสั่งเหล่านั้น wsl.exe (เช่น, wsl ls). แม้ว่านี่จะเป็นการปรับปรุงที่สำคัญ แต่ตัวเลือกนี้ก็ยังมีข้อเสียหลายประการ
นอกจากนี้แพร่หลาย wsl น่าเบื่อและไม่เป็นธรรมชาติ
เส้นทาง Windows ในอาร์กิวเมนต์ไม่ทำงานเสมอไป เนื่องจากแบ็กสแลชถูกตีความว่าเป็นอักขระหลีก แทนที่จะเป็นตัวคั่นไดเรกทอรี
เส้นทาง Windows ในอาร์กิวเมนต์จะไม่ถูกแปลเป็นจุดเชื่อมต่อที่สอดคล้องกันใน WSL
ด้วยเหตุนี้ คำสั่ง Linux จึงได้รับการปฏิบัติเหมือนเป็นพลเมืองชั้นสองภายใต้ Windows และใช้งานยากกว่าคำสั่งแบบเนทิฟ เพื่อให้สิทธิของตนเท่าเทียมกันจำเป็นต้องแก้ไขปัญหาที่ระบุไว้
Wrapper ฟังก์ชัน PowerShell
ด้วยฟังก์ชัน Wrapper ของ PowerShell เราสามารถเพิ่มความสมบูรณ์ของคำสั่งและลดความจำเป็นในการเติมคำนำหน้าได้ wslแปลเส้นทาง Windows เป็นเส้นทาง WSL ข้อกำหนดพื้นฐานสำหรับเปลือกหอย:
สำหรับทุกคำสั่ง Linux จะต้องมี wrapper ฟังก์ชันหนึ่งรายการที่มีชื่อเดียวกัน
เชลล์ต้องรู้จักเส้นทาง Windows ที่ส่งเป็นอาร์กิวเมนต์ และแปลงเป็นเส้นทาง WSL
เปลือกควรโทร wsl ด้วยคำสั่ง Linux ที่เหมาะสมไปยังอินพุตไปป์ไลน์ใด ๆ และส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งใด ๆ ที่ส่งไปยังฟังก์ชัน
# The commands to import.
$commands = "awk", "emacs", "grep", "head", "less", "ls", "man", "sed", "seq", "ssh", "tail", "vim"
# Register a function for each command.
$commands | ForEach-Object { Invoke-Expression @"
Remove-Alias $_ -Force -ErrorAction Ignore
function global:$_() {
for (`$i = 0; `$i -lt `$args.Count; `$i++) {
# If a path is absolute with a qualifier (e.g. C:), run it through wslpath to map it to the appropriate mount point.
if (Split-Path `$args[`$i] -IsAbsolute -ErrorAction Ignore) {
`$args[`$i] = Format-WslArgument (wsl.exe wslpath (`$args[`$i] -replace "", "/"))
# If a path is relative, the current working directory will be translated to an appropriate mount point, so just format it.
} elseif (Test-Path `$args[`$i] -ErrorAction Ignore) {
`$args[`$i] = Format-WslArgument (`$args[`$i] -replace "", "/")
}
}
if (`$input.MoveNext()) {
`$input.Reset()
`$input | wsl.exe $_ (`$args -split ' ')
} else {
wsl.exe $_ (`$args -split ' ')
}
}
"@
}
นอกจากนี้ เนื่องจากขณะนี้เรามีการเติมข้อความอัตโนมัติแบบ bash คุณจึงสามารถเติมเส้นทาง Linux อัตโนมัติได้โดยตรงใน PowerShell!
less /etc/<TAB>
ls /usr/share/<TAB>
vim ~/.bash<TAB>
ในกรณีที่การเติมข้อความอัตโนมัติ bash ไม่สร้างผลลัพธ์ใด ๆ PowerShell จะแปลงกลับเป็นเส้นทาง Windows เริ่มต้นของระบบ ดังนั้นในทางปฏิบัติ คุณสามารถใช้ทั้งสองเส้นทางพร้อมกันได้ตามดุลยพินิจของคุณ
ข้อสรุป
การใช้ PowerShell และ WSL ทำให้เราสามารถรวมคำสั่ง Linux เข้ากับ Windows เป็นแอปพลิเคชันเนทิฟได้ ไม่จำเป็นต้องค้นหาบิลด์ Win32 หรือยูทิลิตี้ Linux หรือขัดจังหวะเวิร์กโฟลว์ของคุณโดยไปที่เชลล์ Linux แค่ ติดตั้ง WSL, กำหนดค่า โปรไฟล์ PowerShell и รายการคำสั่งที่คุณต้องการนำเข้า! การเติมข้อความอัตโนมัติที่สมบูรณ์สำหรับพารามิเตอร์คำสั่ง Linux และ Windows และเส้นทางของไฟล์เป็นฟังก์ชันการทำงานที่ไม่มีในคำสั่ง Windows ดั้งเดิมในปัจจุบัน