跨 Windows 和 Linux 檔案系統運作

在 Windows 與 Linux 檔案系統之間工作時,有許多考慮要牢記在心。 在本指南中,我們已為您概述了其中一些,包括一些混合 Windows 和以 Linux 為基礎之命令的互通性支援範例。

檔案系統之間的檔案儲存和效能

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

例如,儲存 WSL 專案檔時:

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

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

在 Windows 檔案總管中查看您當前的目錄

您可以使用下列命令,從命令列開啟 Windows 檔案總管來查看儲存檔案的目錄:

explorer.exe .

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

若要在 Windows 檔案瀏覽器中查看所有可用的 Linux 發行版本及其根檔案系統,請在網址列中輸入:\\wsl$

在 Windows 檔案總管中查看專案檔案

檔案名和目錄區分大小寫

區分大小寫(區分大小寫)會決定大寫 (FOO.txt) 和小寫 (foo.txt) 字母是否會以相異 (區分大小寫) 或相同 (在檔案名或目錄中) 不區分大小寫的。 Windows 和 linux 檔案系統會以不同的方式處理區分大小寫-Windows 是 insenstive,而 linux 則區分大小寫。 在 調整區分大小寫 的操作說明文章中,深入瞭解如何調整區分大小寫(尤其是在使用 WSL 掛接磁片時)。

Windows 與 Linux 命令之間的互通性

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

  • 從 Linux 命令列( (ie)執行 Windows 工具 (的 notepad.exe) 。 Ubuntu) 。
  • (ie 執行 Linux 工具。從 Windows 命令列使用 grep) (ie。 PowerShell) 。
  • 在 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 散發套件 (ie。 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。