跨 Windows 和 Linux 檔案系統運作

在 Windows 與 Linux 檔案系統之間運作時,有一些需要牢記的考量。 本指南概述其中一些考量,包括混合 Windows 和 Linux 命令的一些互通性支援範例。

跨檔案系統的檔案儲存和效能

建議您不要跨作業系統使用檔案,除非您有這樣做的特定原因。 如需最快的效能速度,如果您是在 Linux 命令列 (Ubuntu、OpenSUSE 等) 中工作,請將檔案儲存在 WSL 檔案系統中。 如果您是在 Windows 命令列 (PowerShell、命令提示字元) 中工作,請將您的檔案儲存在 Windows 檔案系統中。

例如,儲存 WSL 專案檔時:

  • 使用 Linux 檔案系統根目錄:\\wsl$\Ubuntu\home\<user name>\Project
  • 不是 Windows 檔案系統根目錄:/mnt/c/Users/<user name>/Project$C:\Users\<user name>\Project

當您在 WSL 命令列的檔案路徑中看到 /mnt/ 時,這表示您正從掛接的磁碟機工作。 因此,在 WSL 命令列中掛接時,Windows 檔案系統 C:/ 磁碟機 (C:\Users\<user name>\Project) 看起來像這樣:/mnt/c/Users/<user name>/Project$。 您可將專案檔儲存在掛接的磁碟機上,但如果直接將專案檔儲存在 \\wsl$ 磁碟機上,您的效能速度將會改善。

在 Windows 檔案總管中檢視目前的目錄

您可以使用下列方法,從命令列開啟 Windows 檔案總管,以檢視檔案儲存所在的目錄:

explorer.exe .

或者,您也可使用命令:powershell.exe /c start . 務必在命令結尾加上句點,以開啟目前的目錄。

若要在 Windows 檔案總管中檢視所有可用的 Linux 發行版本及其根檔案系統,請在網址列中輸入:\\wsl$

View project files in Windows File Explorer

檔案名稱和目錄區分大小寫

區分大小寫會判斷檔案名稱或目錄中的大寫 (FOO.txt) 和小寫 (foo.txt) 字母會視為相異 (區分大小寫) 或相等 (不區分大小寫) 處理。 Windows 和 Linux 檔案系統會以不同方式處理區分大小寫 - Windows 不區分大小寫,而 Linux 區分大小寫。 深入了解如何調整區分大小寫,特別是在使用 WSL 掛接磁碟時,請參閱調整區分大小寫操作說明一文。

Windows 與 Linux 命令之間的互通性

Windows 與 Linux 工具和命令可與 WSL 交換使用。

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

從 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

使用 WSLENV 在 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。