在 Windows 與 Linux 檔系統之間運作時,有一些需要注意的事項。 本指南概述其中一些內容,包括混合 Windows 和 Linux 命令的互作性支援一些範例。
檔案系統之間的檔案儲存和效能
除非您有特定原因,否則我們不建議在不同作業系統間使用您的檔案。 為了達到最快的效能速度,如果您要在 Linux 命令行中工作,請將檔案儲存在 WSL 文件系統中(Ubuntu、OpenSUSE 等)。 如果您正在 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 交換使用。
- 從 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、管道(piping)和檔案重新導向這些功能都能正常運作。
使用 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 來列出 Linux 檔案系統路徑中的 /proc/cpuinfo 檔案,請使用 PowerShell:
C:\temp> wsl ls -la /proc/cpuinfo
若要使用 Linux 命令 ls -la 來列出 Windows 文件系統路徑中的 C:\Program Files 檔案,請使用 PowerShell:
C:\temp> wsl ls -la "/mnt/c/Program Files"
從 Linux 執行 Windows 工具
WSL 可以直接從 WSL 命令列使用 [tool-name].exe 執行 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 工具必須包含擴展名、符合檔案大小寫,而且是可執行檔。 非可執行檔,包括批次腳本。 可以使用 dir 命令來執行像 cmd.exe /C 這類 CMD 原生命令。
例如,輸入下列命令,列出 Windows 檔案系統 C:\ 目錄的內容:
cmd.exe /C dir
或使用 ping 命令將回應要求傳送至 microsoft.com 網站:
ping.exe www.microsoft.com
參數會傳遞至未修改的 Windows 二進位檔。 例如,下列命令會在C:\temp\foo.txt中開啟notepad.exe。
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 可以存取 PATH 的 Windows 環境變數(因此您可以從 WSL 下啟動 Win32 可執行檔)。 從 17063 開始, WSLENV 開始受到支援。
WSLENV 區分大小寫。
WSLENV 旗標
中有四個旗標可用來影響 WSLENV 中環境變數的轉譯方式。
WSLENV 標誌:
-
/p- 轉譯 WSL/Linux 樣式路徑與 Win32 路徑之間的路徑。 -
/l- 指出環境變數是路徑清單。 -
/u- 表示只有在從 Win32 執行 WSL 時,才應該包含此環境變數。 -
/w- 表示只有在從 WSL 執行 Win32 時,才應該包含此環境變數。
您可以視需要合併旗標。
深入瞭解 WSLENV,包括將 WSLENV 值設定為其他預先定義環境 var 串連的常見問題和範例,每個後綴都有斜線,後面接著旗標,以指定應該如何轉譯值,並以腳本傳遞變數。 本文也包含使用 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 會再次被啟用。