Windows 與 Linux 的互通性

適用於 Linux 的 Windows 子系統 (WSL) 會持續改善 Windows 和 Linux 之間的整合。 您可以:

  • 從 Linux 命令列 (即 Ubuntu) 執行 Windows 工具 (即 notepad.exe)。
  • 從 Windows 命令列 (即 PowerShell) 執行 Linux 工具 (即 grep)。
  • 在 Linux 和 Windows 之間共用環境變數。 (組建 17063+)

注意

如果您執行的是 Creators Update (2017 年 10 月,組建 16299) 或年度更新 (2016 年 8 月,組建 14393),請跳至舊版 Windows 10

從 Windows 命令列執行 Linux 工具

使用 wsl <command> (或 wsl.exe <command>),從 Windows 命令提示字元 (CMD) 或 PowerShell 執行 Linux 二進位檔。

例如:

C:\temp> wsl ls -la
<- contents of C:\temp ->

以這種方式叫用的二進位檔:

  • 使用與目前的 CMD 或 PowerShell 提示相同的工作目錄。
  • 以 WSL 預設使用者身分執行。
  • 具有與呼叫程序和終端機相同的 Windows 系統管理權限。

wsl (或 wsl.exe) 後面的 Linux 命令會如同在 WSL 中執行的任何命令一樣處理。 Sudo、管線和檔案重新導向等工作會運作。

使用 Sudo 來更新預設 Linux 發行版本的範例:

C:\temp> wsl sudo apt-get update

您的預設 Linux 發行版本使用者名稱會在執行此命令之後列出,而系統會要求您輸入密碼。 輸入正確的密碼之後,您的發行版本將會下載更新。

混合 Linux 和 Windows 命令

以下是使用 PowerShell 混合 Linux 和 Windows 命令的幾個範例。

若要使用 Linux 命令 ls -la 來列出檔案,以及使用 PowerShell 命令 findstr 來篩選包含 "git" 的文字結果,請結合下列命令:

wsl ls -la | findstr "git"

若要使用 PowerShell 命令 dir 來列出檔案,以及使用 Linux 命令 grep 來篩選包含 "git" 的文字結果,請結合下列命令:

C:\temp> dir | wsl grep git

若要使用 Linux 命令 ls -la 來列出檔案,以及使用 PowerShell 命令 > out.txt 來將該清單輸出至名為 "out.txt" 的文字檔案,請結合下列命令:

C:\temp> wsl ls -la > out.txt

傳入 wsl.exe 的命令會轉送至 WSL 程序,而不會進行修改。 檔案路徑必須以 WSL 格式指定。

若要使用 Linux 命令 ls -la 來列出 /proc/cpuinfo Linux 檔案系統路徑中的檔案,請使用 PowerShell:

C:\temp> wsl ls -la /proc/cpuinfo

若要使用 Linux 命令 ls -la 來列出 C:\Program Files Windows 檔案系統路徑中的檔案,請使用 PowerShell:

C:\temp> wsl ls -la "/mnt/c/Program Files"

從 Linux 執行 Windows 工具

WSL 可以使用 [tool-name].exe,直接從 WSL 命令列執行 Windows 工具。 例如,notepad.exe

以這種方式執行的應用程式具有下列屬性:

  • 將工作目錄保留為 WSL 命令提示字元 (針對大部分,例外狀況如下所述)。
  • 具有與 WSL 程序相同的權限。
  • 以作用中的 Windows 使用者身分執行。
  • 會顯示在 Windows 工作管理員中,如同直接從命令提示字元執行一樣。

在 WSL 中執行的 Windows 可執行檔的處理方式類似於原生 Linux 可執行檔:管線、重新導向,甚至是背景處理如預期般運作。

若要執行 Windows 工具 ipconfig.exe,請使用 Linux 工具 grep 來篩選 "IPv4" 結果,並使用 Linux 工具 cut 來移除資料列欄位,然後從 Linux 發行版本 (例如 Ubuntu) 輸入:

ipconfig.exe | grep IPv4 | cut -d: -f2

讓我們試試一個混合使用 Windows 和 Linux 命令的範例。 開啟您的 Linux 發行版本 (即 Ubuntu) 並建立文字檔案:touch foo.txt。 現在使用 Linux 命令 ls -la 列出直接檔案和其建立詳細資料,然後使用 Windows PowerShell 工具 findstr.exe 來篩選結果,讓結果中只顯示您的 foo.txt 檔案:

ls -la | findstr.exe foo.txt

Windows 工具必須包含副檔名、符合檔案大小寫,而且必須是可執行檔。 非可執行檔,包括批次指令碼。 CMD 原生命令 (例如 dir) 可以使用 cmd.exe /C 命令來執行。

例如,若要列出 Windows 檔案系統 C:\ 目錄的內容,請輸入:

cmd.exe /C dir

或者,使用 ping 命令將回應要求傳送至 microsoft.com 網站:

ping.exe www.microsoft.com

參數會未加修改傳遞至 Windows 二進位檔。 例如,下列命令會在 notepad.exe 中開啟 C:\temp\foo.txt

notepad.exe "C:\temp\foo.txt"

這也適用:

notepad.exe C:\\temp\\foo.txt

在 Windows 和 WSL 之間共用環境變數

WSL 與 Windows 共用 WSLENV,這是為了橋接在 WSL 上執行的 Windows 和 Linux 發行版本而建立的特殊環境變數。

WSLENV 變數的屬性:

  • 它是共用的;它存在於 Windows 和 WSL 環境中。
  • 這是要在 Windows 和 WSL 之間共用的環境變數清單。
  • 它可以將環境變數格式化,以便在 Windows 和 WSL 中順利運作。
  • 其有助於 WSL 與 Win32 之間的流程。

注意

在 17063 之前,WSL 可以存取的唯一 Windows 環境變數是 PATH (因此您可以從 WSL 下啟動 Win32 可執行檔)。 從 17063 開始,WSLENV 開始受到支援。 WSLENV 要區分大小寫。

WSLENV 旗標

WSLENV 中有四個可用的旗標,可影響環境變數的轉譯方式。

WSLENV 旗標:

  • /p - 轉譯 WSL/Linux 樣式路徑和 Win32 路徑之間的路徑。
  • /l - 指出環境變數是路徑的清單。
  • /u - 表示在從 Win32 執行 WSL 時,應該只包含此環境變數。
  • /w - 指出只有從 WSL 執行 Win32 時,才應包含這個環境變數。

旗標可以視需要結合。

請深入了解 WSLENV,包括將 WSLENV 的值設定為串連了其他預先定義環境變數的常見問題和範例,每個變數尾端會加上一個斜線,其後則是指定應該如何使用指令碼來轉譯值並傳遞變數的旗標。 本文也包含如何使用 Go 程式設計語言來設定開發環境的範例,其已設定為會在 WSL 與 Win32 之間共用 GOPATH。

停用互通性

使用者可以藉由以 root 身分執行下列命令,停用對單一 WSL 工作階段執行 Windows 工具的功能:

echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop

若要重新啟用 Windows 二進位檔,請結束所有 WSL 工作階段,然後重新執行 bash.exe,或以 root 身分執行下列命令:

echo 1 > /proc/sys/fs/binfmt_misc/WSLInterop

停用 interop 不會在 WSL 工作階段之間保存,當新的工作階段啟動時,將會再次啟用 interop。

舊版 Windows 10

舊版 Windows 10 中的互通性命令有許多差異。 如果您執行的是 Creators Update (2017 年 10 月,組建 16299) 或年度更新 (2016 年 8 月,組建 14393) 版的 Windows 10,建議您 更新為最新的 Windows 版本,但如果不可行,我們已在下方概述一些互通性差異。

摘要:

  • bash.exe 已取代為 wsl.exe
  • wsl.exe 不需要執行單一命令的 -c 選項。
  • Windows 路徑包含在 WSL $PATH 中。
  • 停用 interop 的程序不變。

Linux 命令可以從 Windows 命令提示字元或從 PowerShell 執行,但對於早期的 Windows 版本,您可能需要使用 bash 命令。 例如:

C:\temp> bash -c "ls -la"

輸入、管線和檔案重新導向等工作會如預期般運作。

傳入 bash -c 的 WSL 命令會轉送至 WSL 程序,而不會進行修改。 檔案路徑必須以 WSL 格式指定,逸出相關字元時必須小心謹慎。 範例:

C:\temp> bash -c "ls -la /proc/cpuinfo"

或...

C:\temp> bash -c "ls -la \"/mnt/c/Program Files\""

從舊版 Windows 10 中的 WSL 發行版本呼叫 Windows 工具時,您將需要指定目錄路徑。 例如,從您的 WSL 命令列輸入:

/mnt/c/Windows/System32/notepad.exe

在 WSL 中,這些可執行檔的處理方式類似於原生 Linux 可執行檔。 這表示將目錄新增至 Linux 路徑,而命令之間的管線則會如預期般運作。 例如:

export PATH=$PATH:/mnt/c/Windows/System32

ipconfig.exe | grep IPv4 | cut -d: -f2

Windows 二進位檔必須包含副檔名、符合檔案大小寫,而且可以是可執行檔。 非可執行檔,包括批次指令碼和命令 (例如 dir) 可以使用 /mnt/c/Windows/System32/cmd.exe /C 命令來執行。 例如:

/mnt/c/Windows/System32/cmd.exe /C dir

其他資源