跨 Windows 和 Linux 檔案系統運作
在 Windows 與 Linux 檔案系統之間運作時,有一些需要牢記的考量。 本指南概述其中一些考量,包括混合 Windows 和 Linux 命令的一些互通性支援範例。
跨檔案系統的檔案儲存和效能
建議您不要跨作業系統使用檔案,除非您有這樣做的特定原因。 如需最快的效能速度,如果您是在 Linux 命令列 (Ubuntu、OpenSUSE 等) 中工作,請將檔案儲存在 WSL 檔案系統中。 如果您是在 Windows 命令列 (PowerShell、命令提示字元) 中工作,請將您的檔案儲存在 Windows 檔案系統中。
例如,儲存 WSL 專案檔時:
- 使用 Linux 檔案系統根目錄:
/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$
檔案名稱和目錄區分大小寫
區分大小寫會判斷檔案名稱或目錄中的大寫 (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。